/
getType.go
100 lines (84 loc) · 2.35 KB
/
getType.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
package paperfishGo
import (
"reflect"
"strings"
"github.com/luisfurquim/stonelizard"
)
func getType(t stonelizard.SwaggerSchemaT) (string, reflect.Type, error) {
Goose.Fetch.Logf(4, "Type is %s", strings.ToLower(t.Type))
switch strings.ToLower(t.Type) {
case "string", "file":
return t.Title, reflect.TypeOf(""), nil
case "number":
return t.Title, reflect.TypeOf(float64(.1)), nil
case "integer":
return t.Title, reflect.TypeOf(int64(1)), nil
case "boolean":
return t.Title, reflect.TypeOf(true), nil
case "object":
return getStruct(t.Title, t.Properties)
case "array":
if t.XKeyType!="" {
return getMap(t.XKeyType, t.Items)
} else {
return getArray(t.Items)
}
}
return "", reflect.TypeOf(""), ErrUnknownKind
}
func getStruct(title string, fields map[string]stonelizard.SwaggerSchemaT) (string, reflect.Type, error) {
var t reflect.Type
var tit string
var err error
var k string
var v stonelizard.SwaggerSchemaT
var flds []reflect.StructField
var jsonName string
for k, v = range fields {
jsonName = ""
if k[0:1] == strings.ToLower(k[0:1]) {
jsonName = `json:"` + k + `"`
k = strings.ToUpper(k[0:1]) + k[1:]
}
tit, t, err = getType(v)
if err!=nil {
return title, t, err
}
flds = append(flds, reflect.StructField{
Name: k,
Type: t,
Tag: reflect.StructTag(`typename:"` + tit + `"` + jsonName),
})
}
return title, reflect.StructOf(flds), nil
}
func getArray(items *stonelizard.SwaggerSchemaT) (string, reflect.Type, error) {
var t reflect.Type
var err error
var title string
if items == nil {
return "", reflect.ArrayOf(0,reflect.TypeOf(true)), nil
}
title, t, err = getType(*items)
if err!=nil {
return title, t, err
}
return items.Title, reflect.ArrayOf(0,t), nil
}
func getMap(key string, items *stonelizard.SwaggerSchemaT) (string, reflect.Type, error) {
var t reflect.Type
var err error
var ktype reflect.Type
var title string
title, ktype, err = getType(stonelizard.SwaggerSchemaT{
Type: key,
})
if err!=nil {
return title, t, err
}
title, t, err = getType(*items)
if err!=nil {
return title, t, err
}
return items.Title, reflect.MapOf(ktype,t), nil
}