1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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)
- }
|