mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-06 04:20:11 +00:00
76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/iancoleman/strcase"
|
|
"gopkg.in/yaml.v3"
|
|
"reflect"
|
|
"strconv"
|
|
)
|
|
|
|
func BuildModel(node *yaml.Node, model interface{}) error {
|
|
v := reflect.ValueOf(model).Elem()
|
|
for i := 0; i < v.NumField(); i++ {
|
|
|
|
fName := v.Type().Field(i).Name
|
|
fieldName := strcase.ToLowerCamel(fName)
|
|
_, vn := FindKeyNode(fieldName, node.Content)
|
|
|
|
field := v.FieldByName(fName)
|
|
switch v.Field(i).Kind() {
|
|
case reflect.Int:
|
|
if vn != nil {
|
|
if IsNodeIntValue(vn) {
|
|
if field.CanSet() {
|
|
fv, _ := strconv.Atoi(vn.Value)
|
|
field.SetInt(int64(fv))
|
|
}
|
|
}
|
|
}
|
|
break
|
|
case reflect.String:
|
|
if vn != nil {
|
|
if IsNodeStringValue(vn) {
|
|
if field.CanSet() {
|
|
field.SetString(vn.Value)
|
|
}
|
|
}
|
|
}
|
|
break
|
|
case reflect.Bool:
|
|
if vn != nil {
|
|
if IsNodeBoolValue(vn) {
|
|
if field.CanSet() {
|
|
bv, _ := strconv.ParseBool(vn.Value)
|
|
field.SetBool(bv)
|
|
}
|
|
}
|
|
}
|
|
break
|
|
case reflect.Array:
|
|
// TODO
|
|
break
|
|
case reflect.Float32, reflect.Float64:
|
|
if vn != nil {
|
|
if IsNodeFloatValue(vn) {
|
|
if field.CanSet() {
|
|
fv, _ := strconv.ParseFloat(vn.Value, 64)
|
|
field.SetFloat(fv)
|
|
}
|
|
}
|
|
}
|
|
break
|
|
case reflect.Struct:
|
|
// TODO
|
|
break
|
|
|
|
default:
|
|
fmt.Printf("Unsupported type: %v", v.Field(i).Kind())
|
|
break
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
}
|