package sentio import ( "bytes" "fmt" "strconv" "strings" "unicode/utf8" ) type OrderIntent int8 const ( BuyToOpen OrderIntent = iota BuyToClose SellToOpen SellToClose ) var intents = map[OrderIntent]string{ BuyToOpen: "buy_to_open", BuyToClose: "buy_to_close", SellToOpen: "sell_to_open", SellToClose: "sell_to_close", } func (s OrderIntent) String() string { if intent, ok := intents[s]; ok { return intent } return "undefined" } func (s OrderIntent) MarshalJSON() ([]byte, error) { intent := s.String() return []byte(`"` + intent + `"`), nil } func (s *OrderIntent) UnmarshalJSON(data []byte) error { var ( intent OrderIntent runes = bytes.Runes(data) err error ) if l := utf8.RuneCount(data); runes != nil && runes[0] == 34 && runes[l-1] == 34 { data = data[1 : l-1] intent, err = ParseOrderIntent(string(data)) } else { n, err := strconv.Atoi(string(data)) if err == nil { intent = OrderIntent(n) } } if err != nil { return err } if _, ok := intents[intent]; !ok { return fmt.Errorf("unknown `OrderIntent`: %s", data) } *s = intent return nil } func ParseOrderIntent(s string) (OrderIntent, error) { s = strings.TrimSpace(s) s = strings.ToLower(s) for intent, s2 := range intents { if s == s2 { return intent, nil } } return -1, fmt.Errorf("`sentio.ParseOrderIntent`: undefined OrderIntent `%s`", s) }