mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-06 12:37:49 +00:00
Working on building out models
a recursive approach? or a dfs approach? not sure yet. still playing with ideas.
This commit is contained in:
75
utils/model_builder.go
Normal file
75
utils/model_builder.go
Normal file
@@ -0,0 +1,75 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user