89 lines
2.0 KiB
Go
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
|
|
}
|