go_clientinfo/server/funcs_r00tclient.go
2024-12-12 02:22:54 -05:00

89 lines
2.0 KiB
Go

package server
import (
`reflect`
`strings`
)
/*
ToMap generates and returns a map representation of a R00tClient.
Keys by default use the YAML tag for the name.
If they are specified with the tag `renderName:"-"`, they are skipped.
If they are specified with the tag `renderName:"Foo"`, the string "Foo" will
be used as the key instead.
Only bools, strings, and pointers thereof are allowed.
m will never be nil, but may be empty.
Currently err will always be nil but is specified for future API compatibility.
It should be handled by callers for future-proofing, as it may not always be nil
in the future.
*/
func (r *R00tClient) ToMap() (m map[string]string, err error) {
var ok bool
var tagVal string
var field reflect.StructField
var fieldVal reflect.Value
var rootVal reflect.Value
m = make(map[string]string)
if r == nil {
return
}
rootVal = reflect.ValueOf(r).Elem()
for i := 0; i < rootVal.NumField(); i++ {
field = rootVal.Type().Field(i)
fieldVal = rootVal.Field(i)
// Only exported.
if field.PkgPath != "" {
continue
}
// Get the key name.
tagVal = field.Tag.Get(prettyTag)
if tagVal == "-" {
continue
}
if _, ok = field.Tag.Lookup(prettyTag); !ok {
tagVal = field.Tag.Get("yaml")
if tagVal == "" || strings.HasPrefix(tagVal, "-") {
// Use the field name itself. YOLO
tagVal = field.Name
} else {
tagVal = strings.Split(tagVal, ",")[0]
}
}
switch fieldVal.Kind() {
case reflect.Bool:
if fieldVal.Interface().(bool) {
m[tagVal] = trueUaFieldStr
} else {
m[tagVal] = falseUaFieldStr
}
case reflect.String:
m[tagVal] = fieldVal.String()
case reflect.Ptr:
if fieldVal.IsNil() {
m[tagVal] = nilUaFieldStr
} else {
switch fieldVal.Type().Elem().Kind() {
case reflect.Bool:
if fieldVal.Elem().Bool() {
m[tagVal] = trueUaFieldStr
} else {
m[tagVal] = falseUaFieldStr
}
case reflect.String:
m[tagVal] = fieldVal.Elem().String()
}
}
}
}
return
}