Marshal / Unmarshal псевдоним типа в bson - PullRequest
0 голосов
/ 05 мая 2018

На мой последний вопрос я хочу преобразовать eunm (псевдоним типа) в строку, когда я пишу его в mongodb с помощью mgo. Я знаю, что мне нужно добавить правила для bson Marshal / Unmarshal, но с json все по-другому, мне нужно реализовать UnmarshalJSON и MarshalJSON, так что мне делать с bson? Код ниже записать число в поле S, но я хочу соответствующую строку

package main

import (
    "encoding/json"

    mgo "gopkg.in/mgo.v2"
)

type trxStatus int

type test struct {
    S trxStatus
    A string
}

const (
    buySubmitted trxStatus = iota
    buyFilled
    sellSubmiited
    sellFilled
    finished
)

var ss = [...]string{"buySubmitted", "buyFilled", "sellSubmiited", "sellFilled", "Finished"}

// that's what I do for json
func (s *trxStatus) UnmarshalJSON(bytes []byte) error {
    var status string
    json.Unmarshal(bytes, &status)
    // unknown
    for i, v := range ss {
        if v == status {
            tttt := trxStatus(i)
            *s = tttt
            break
        }
    }
    return nil
}

func (s trxStatus) MarshalJSON() ([]byte, error) {
    return json.Marshal(s.String())
}

func (s trxStatus) String() string {

    if s < buySubmitted || s > finished {
        return "Unknown"
    }

    return ss[s]
}

func main() {
    db, _ := mgo.Dial("localhost")

    s := test{S: buyFilled, A: "hello"}
    c := db.DB("test").C("test")
    c.Insert(s)
}
...