aboutsummaryrefslogblamecommitdiff
path: root/connector/marshal.go
blob: 3321fb099d481a41f50e91b1254a0fb5bba756af (plain) (tree)


































































































                                                                         
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
}