strimertul/docs/data.go

95 lines
2.3 KiB
Go

package docs
import (
"fmt"
"reflect"
"strings"
"github.com/strimertul/strimertul/docs/interfaces"
)
type DataObject struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Kind Kind `json:"kind"`
Keys []DataObject `json:"keys,omitempty"`
Key *DataObject `json:"key,omitempty"`
Element *DataObject `json:"element,omitempty"`
EnumValues []string `json:"enumValues,omitempty"`
}
type KeyObject struct {
Description string `json:"description"`
Schema DataObject `json:"schema"`
Tags []interfaces.KeyTag `json:"tags,omitempty"`
}
type Kind string
const (
KindString Kind = "string"
KindInt Kind = "int"
KindFloat Kind = "float"
KindStruct Kind = "object"
KindBoolean Kind = "boolean"
KindEnum Kind = "enum"
KindUnknown Kind = "unknown"
KindArray Kind = "array"
KindDict Kind = "dictionary"
)
func getKind(typ reflect.Kind) Kind {
switch typ {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr:
return KindInt
case reflect.Float32, reflect.Float64:
return KindFloat
case reflect.String:
return KindString
case reflect.Bool:
return KindBoolean
case reflect.Struct:
return KindStruct
case reflect.Map:
return KindDict
case reflect.Array, reflect.Slice:
return KindArray
}
return KindUnknown
}
func parseType(typ reflect.Type) (out DataObject) {
out.Name = typ.Name()
if enum, ok := Enums[out.Name]; ok {
out.Kind = KindEnum
for _, it := range enum.Values {
out.EnumValues = append(out.EnumValues, fmt.Sprint(it))
}
return
}
out.Kind = getKind(typ.Kind())
if out.Kind == KindArray || out.Kind == KindDict {
elem := parseType(typ.Elem())
out.Element = &elem
if out.Kind == KindDict {
key := parseType(typ.Key())
out.Key = &key
}
}
if out.Kind == KindStruct {
for index := 0; index < typ.NumField(); index++ {
field := typ.Field(index)
obj := parseType(field.Type)
if jsonName, ok := field.Tag.Lookup("json"); ok {
parts := strings.SplitN(jsonName, ",", 2)
obj.Name = parts[0]
} else {
obj.Name = field.Name
}
obj.Description = field.Tag.Get("desc")
out.Keys = append(out.Keys, obj)
}
}
return
}