Working on building out models

a recursive approach? or a dfs approach? not sure yet. still playing with ideas.
This commit is contained in:
Dave Shanley
2022-07-29 09:44:37 -04:00
parent a906d46227
commit eda834f79f
9 changed files with 210 additions and 3 deletions

75
utils/model_builder.go Normal file
View 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
}