9 // MarshalJSON is an implementation of json.Marshaler that allows Type
10 // instances to be serialized as JSON.
12 // All standard types can be serialized, but capsule types cannot since there
13 // is no way to automatically recover the original pointer and capsule types
14 // compare by equality.
15 func (t Type) MarshalJSON() ([]byte, error) {
16 switch impl := t.typeImpl.(type) {
19 case primitiveTypeBool:
20 return []byte{'"', 'b', 'o', 'o', 'l', '"'}, nil
21 case primitiveTypeNumber:
22 return []byte{'"', 'n', 'u', 'm', 'b', 'e', 'r', '"'}, nil
23 case primitiveTypeString:
24 return []byte{'"', 's', 't', 'r', 'i', 'n', 'g', '"'}, nil
26 panic("unknown primitive type kind")
28 case typeList, typeMap, typeSet:
29 buf := &bytes.Buffer{}
30 etyJSON, err := t.ElementType().MarshalJSON()
37 buf.WriteString(`"list"`)
39 buf.WriteString(`"map"`)
41 buf.WriteString(`"set"`)
46 return buf.Bytes(), nil
48 buf := &bytes.Buffer{}
49 atysJSON, err := json.Marshal(t.AttributeTypes())
53 buf.WriteString(`["object",`)
56 return buf.Bytes(), nil
58 buf := &bytes.Buffer{}
59 etysJSON, err := json.Marshal(t.TupleElementTypes())
63 buf.WriteString(`["tuple",`)
66 return buf.Bytes(), nil
67 case pseudoTypeDynamic:
68 return []byte{'"', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '"'}, nil
70 return nil, fmt.Errorf("type not allowed: %s", t.FriendlyName())
72 // should never happen
73 panic("unknown type implementation")
77 // UnmarshalJSON is the opposite of MarshalJSON. See the documentation of
78 // MarshalJSON for information on the limitations of JSON serialization of
80 func (t *Type) UnmarshalJSON(buf []byte) error {
81 r := bytes.NewReader(buf)
82 dec := json.NewDecoder(r)
84 tok, err := dec.Token()
89 switch v := tok.(type) {
99 *t = DynamicPseudoType
101 return fmt.Errorf("invalid primitive type name %q", v)
105 return fmt.Errorf("extraneous data after type description")
110 return fmt.Errorf("invalid complex type description")
113 tok, err = dec.Token()
118 kind, ok := tok.(string)
120 return fmt.Errorf("invalid complex type kind name")
126 err = dec.Decode(&ety)
133 err = dec.Decode(&ety)
140 err = dec.Decode(&ety)
146 var atys map[string]Type
147 err = dec.Decode(&atys)
154 err = dec.Decode(&etys)
160 return fmt.Errorf("invalid complex type kind name")
163 tok, err = dec.Token()
167 if delim, ok := tok.(json.Delim); !ok || rune(delim) != ']' || dec.More() {
168 return fmt.Errorf("unexpected extra data in type description")
174 return fmt.Errorf("invalid type description")