easybridge/connector/marshal.go

100 lines
1.9 KiB
Go

package connector
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"io"
)
func (t EventType) MarshalText() ([]byte, error) {
switch t {
case EVENT_JOIN:
return []byte("join"), nil
case EVENT_LEAVE:
return []byte("leave"), nil
case EVENT_MESSAGE:
return []byte("message"), nil
case EVENT_ACTION:
return []byte("action"), nil
default:
return nil, fmt.Errorf("Invalid event type: %d", t)
}
}
func (t *EventType) UnmarshalText(text []byte) error {
switch string(text) {
case "join":
*t = EVENT_JOIN
return nil
case "leave":
*t = EVENT_LEAVE
return nil
case "message":
*t = EVENT_MESSAGE
return nil
case "action":
*t = EVENT_ACTION
return nil
default:
return fmt.Errorf("Invalid event type: %s", string(text))
}
}
// ----
type MediaObjectJSON struct {
Filename string `json:"filename"`
Mimetype string `json:"mime_type"`
ImageSize *ImageSize `json:"image_size"`
Data string `json:"data"`
}
func (mo SMediaObject) MarshalJSON() ([]byte, error) {
if MediaObject(mo) == nil {
return []byte("null"), nil
}
mod := MediaObjectJSON{
Filename: mo.Filename(),
Mimetype: mo.Mimetype(),
ImageSize: mo.ImageSize(),
}
rd, err := mo.Read()
if err != nil {
return nil, err
}
defer rd.Close()
buf := bytes.NewBuffer([]byte{})
_, err = io.Copy(buf, rd)
if err != nil {
return nil, err
}
mod.Data = base64.StdEncoding.EncodeToString(buf.Bytes())
return json.Marshal(&mod)
}
func (mo *SMediaObject) UnmarshalJSON(jdata []byte) error {
if string(jdata) == "null" {
return nil
}
var d MediaObjectJSON
err := json.Unmarshal(jdata, &d)
if err != nil {
return err
}
bytes, err := base64.StdEncoding.DecodeString(d.Data)
if err != nil {
return err
}
*mo = SMediaObject{&BlobMediaObject{
ObjectFilename: d.Filename,
ObjectMimetype: d.Mimetype,
ObjectImageSize: d.ImageSize,
ObjectData: bytes,
}}
return nil
}