package xvdoc import ( "bytes" "encoding/json" "fmt" ) type dropDown struct { values []string x int y int dx int dy int } func (s *dropDown) UnmarshalJSON(src []byte) (err error) { s.y, s.x, s.dy, s.dx = -1, -1, -1, -1 dec := json.NewDecoder(bytes.NewReader(src)) var empty interface{} var t json.Token for dec.More() && err == nil { if t, err = dec.Token(); err == nil { if _, check := t.(json.Delim); !check { switch t.(string) { case "dx": err = dec.Decode(&s.dx) case "dy": err = dec.Decode(&s.dy) case "x": err = dec.Decode(&s.x) case "y": err = dec.Decode(&s.y) case "values": err = dec.Decode(&s.values) default: dec.Decode(&empty) } } } } if s.x == -1 { err = fmt.Errorf("xvdoc dropdown list parse error :: expected x field") return } if s.y == -1 { err = fmt.Errorf("xvdoc dropdown list parse error :: expected y field") return } if s.dx == -1 { s.dx = s.x } if s.dy == -1 { s.dy = -1 } return }