-
Notifications
You must be signed in to change notification settings - Fork 0
/
data_schema.go
118 lines (109 loc) · 3.36 KB
/
data_schema.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package data_schema
import (
"encoding/json"
"fmt"
controls "github.com/galenliu/gateway/pkg/wot/definitions/hypermedia_controls"
"github.com/tidwall/gjson"
)
const (
ApplicationJson = "application/json"
LdJSON = "application/ld+json"
SenmlJSON = "application/senml+json"
CBOR = "application/cbor"
SenmlCbor = "application/senml+cbor"
XML = "application/xml"
SenmlXML = "application/senml+xml"
EXI = "application/exi"
)
type Schema interface {
GetType() controls.DataSchemaType
IsReadOnly() bool
}
type DataSchema struct {
AtType string `json:"@type,omitempty" wot:"optional"`
Title string `json:"title,omitempty" wot:"optional"`
Titles controls.MultiLanguage `json:"titles,omitempty" wot:"optional"`
Description string `json:"description,omitempty" wot:"optional"`
Descriptions controls.MultiLanguage `json:"descriptions,omitempty" wot:"optional"`
Const any `json:"const,omitempty" wot:"optional"`
Default any `json:"default,omitempty" wot:"optional"`
Unit string `json:"unit,omitempty" wot:"optional"`
OneOf []DataSchema `json:"oneOf,,omitempty" wot:"optional"`
Enum []any `json:"enum,omitempty" wot:"optional"`
ReadOnly bool `json:"readOnly,omitempty" wot:"withDefault"`
WriteOnly bool `json:"writeOnly,omitempty" wot:"withDefault"`
Format string `json:"format,omitempty" wot:"optional"`
Type string `json:"type,,omitempty" wot:"optional"`
}
func UnmarshalSchema(data []byte) (s Schema, e error) {
dataType := gjson.GetBytes(data, "type").String()
if dataType == "" {
return nil, fmt.Errorf("invaild type")
}
var err error
switch dataType {
case controls.TypeInteger:
var dataSchema IntegerSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeNumber:
var dataSchema NumberSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeBoolean:
var dataSchema BooleanSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeArray:
var dataSchema ArraySchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeObject:
var dataSchema ObjectSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeNull:
var dataSchema NullSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
case controls.TypeString:
var dataSchema StringSchema
err = json.Unmarshal(data, &dataSchema)
if err != nil {
return nil, err
}
return dataSchema, nil
default:
return nil, fmt.Errorf("unsupported type: %s", dataType)
}
}
func (schema *DataSchema) GetType() string {
return schema.Type
}
func (schema *DataSchema) GetAtType() string {
return schema.AtType
}
func (schema *DataSchema) GetDescription() string {
return schema.Description
}
func (schema *DataSchema) IsReadOnly() bool {
return schema.ReadOnly
}