| package comment |
| |
| /* |
| Common implementation of a comment. |
| */ |
| |
| import ( |
| "bytes" |
| "encoding/gob" |
| "encoding/json" |
| "time" |
| ) |
| |
| // Comment is a struct containing a comment by a user on a given entity. |
| type Comment struct { |
| Id string |
| Message string |
| Timestamp time.Time |
| User string |
| } |
| |
| // Return a Comment instance. |
| func New(id, msg, user string) *Comment { |
| return &Comment{ |
| Id: id, |
| Message: msg, |
| Timestamp: time.Now().UTC(), |
| User: user, |
| } |
| } |
| |
| // Return a copy of the Comment. |
| func (c *Comment) Copy() *Comment { |
| return &Comment{ |
| Id: c.Id, |
| Message: c.Message, |
| Timestamp: c.Timestamp, |
| User: c.User, |
| } |
| } |
| |
| // comment makes up the raw contents of a Comment. |
| type comment struct { |
| Id string `json:"id"` |
| Message string `json:"message"` |
| Timestamp time.Time `json:"timestamp"` |
| User string `json:"user"` |
| } |
| |
| // See docs for json.Marshaler. |
| func (c *Comment) MarshalJSON() ([]byte, error) { |
| c.Timestamp = c.Timestamp.UTC() |
| return json.Marshal(comment{ |
| Id: c.Id, |
| Message: c.Message, |
| Timestamp: c.Timestamp, |
| User: c.User, |
| }) |
| } |
| |
| // See docs for json.Unmarshaler. |
| func (c *Comment) UnmarshalJSON(b []byte) error { |
| var body comment |
| if err := json.Unmarshal(b, &body); err != nil { |
| return err |
| } |
| c.Id = body.Id |
| c.Message = body.Message |
| c.Timestamp = body.Timestamp.UTC() |
| c.User = body.User |
| return nil |
| } |
| |
| // See docs for gob.GobEncoder. |
| func (c *Comment) GobEncode() ([]byte, error) { |
| c.Timestamp = c.Timestamp.UTC() |
| buf := bytes.NewBuffer([]byte{}) |
| if err := gob.NewEncoder(buf).Encode(comment{ |
| Id: c.Id, |
| Message: c.Message, |
| Timestamp: c.Timestamp, |
| User: c.User, |
| }); err != nil { |
| return nil, err |
| } |
| return buf.Bytes(), nil |
| } |
| |
| // See docs for gob.GobDecoder. |
| func (c *Comment) GobDecode(b []byte) error { |
| var body comment |
| if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&body); err != nil { |
| return err |
| } |
| c.Id = body.Id |
| c.Message = body.Message |
| c.Timestamp = body.Timestamp.UTC() |
| c.User = body.User |
| return nil |
| } |