value.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package lorca
  2. import "encoding/json"
  3. // Value is a generic type of a JSON value (primitive, object, array) and
  4. // optionally an error value.
  5. type Value interface {
  6. Err() error
  7. To(interface{}) error
  8. Float() float32
  9. Int() int
  10. String() string
  11. Bool() bool
  12. Object() map[string]Value
  13. Array() []Value
  14. Bytes() []byte
  15. }
  16. type value struct {
  17. err error
  18. raw json.RawMessage
  19. }
  20. func (v value) Err() error { return v.err }
  21. func (v value) Bytes() []byte { return v.raw }
  22. func (v value) To(x interface{}) error { return json.Unmarshal(v.raw, x) }
  23. func (v value) Float() (f float32) { v.To(&f); return f }
  24. func (v value) Int() (i int) { v.To(&i); return i }
  25. func (v value) String() (s string) { v.To(&s); return s }
  26. func (v value) Bool() (b bool) { v.To(&b); return b }
  27. func (v value) Array() (values []Value) {
  28. array := []json.RawMessage{}
  29. v.To(&array)
  30. for _, el := range array {
  31. values = append(values, value{raw: el})
  32. }
  33. return values
  34. }
  35. func (v value) Object() (object map[string]Value) {
  36. object = map[string]Value{}
  37. kv := map[string]json.RawMessage{}
  38. v.To(&kv)
  39. for k, v := range kv {
  40. object[k] = value{raw: v}
  41. }
  42. return object
  43. }