dropdown.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package xvdoc
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. )
  7. type dropDown struct {
  8. values []string
  9. x int
  10. y int
  11. dx int
  12. dy int
  13. }
  14. func (s *dropDown) UnmarshalJSON(src []byte) (err error) {
  15. s.y, s.x, s.dy, s.dx = -1, -1, -1, -1
  16. dec := json.NewDecoder(bytes.NewReader(src))
  17. var empty interface{}
  18. var t json.Token
  19. for dec.More() && err == nil {
  20. if t, err = dec.Token(); err == nil {
  21. if _, check := t.(json.Delim); !check {
  22. switch t.(string) {
  23. case "dx":
  24. err = dec.Decode(&s.dx)
  25. case "dy":
  26. err = dec.Decode(&s.dy)
  27. case "x":
  28. err = dec.Decode(&s.x)
  29. case "y":
  30. err = dec.Decode(&s.y)
  31. case "values":
  32. err = dec.Decode(&s.values)
  33. default:
  34. dec.Decode(&empty)
  35. }
  36. }
  37. }
  38. }
  39. if s.x == -1 {
  40. err = fmt.Errorf("xvdoc dropdown list parse error :: expected x field")
  41. return
  42. }
  43. if s.y == -1 {
  44. err = fmt.Errorf("xvdoc dropdown list parse error :: expected y field")
  45. return
  46. }
  47. if s.dx == -1 {
  48. s.dx = s.x
  49. }
  50. if s.dy == -1 {
  51. s.dy = -1
  52. }
  53. return
  54. }