displayStructFields now recurse into nested structs

This commit is contained in:
yo 2021-12-18 17:15:06 +01:00
parent 3fdca54cc4
commit 06900bfa9c

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"log" "log"
"reflect" "reflect"
"strings"
"io/ioutil" "io/ioutil"
"gocage/jail" "gocage/jail"
"encoding/json" "encoding/json"
@ -14,6 +15,46 @@ import (
var gJails []Jail var gJails []Jail
func getStructField(parentStruct interface{}, fieldName string) (reflect.Value, string) {
v := reflect.ValueOf(parentStruct)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if false {
for i := 0 ; i < v.NumField(); i++ {
f := v.Field(i)
if f.Kind() == reflect.String {
fmt.Printf("%v=%v\n", v.Type().Field(i).Name, f.Interface())
}
}
}
if strings.Contains(fieldName, ".") {
fs := strings.Split(fieldName, ".")
f := v.FieldByName(fs[0])
if f.Kind() == reflect.Struct {
return getStructField(f.Interface(), strings.Join(fs[1:], "."))
} else {
log.Fatalln(fmt.Sprintf("%s is not a struct: %s\n", fs[0], f.Kind().String()))
}
}
if false {
if v.FieldByName(fieldName).IsValid() {
log.Println(fmt.Sprintf("%s value: %s", fieldName, v.FieldByName(fieldName).Interface()))
} else {
log.Println(fmt.Sprintf("%s is invalid", fieldName))
}
}
return v, fieldName
}
/* Pretty display of jails field /* Pretty display of jails field
Fields to show are given in a string array parameter Fields to show are given in a string array parameter
Ex. : displayJails(["Name", "JID", "RootPath"]) Ex. : displayJails(["Name", "JID", "RootPath"])
@ -46,14 +87,17 @@ func displayStructFields(jails []Jail, valsToDisplay []string) {
line := make([]Field, len(valsToDisplay)) line := make([]Field, len(valsToDisplay))
for i, f := range valsToDisplay { for i, f := range valsToDisplay {
a := reflect.ValueOf(&tj).Elem() a, f := getStructField(tj, f)
field := Field { field := Field {
Name: f, Name: f,
} }
if a.Elem().FieldByName(f).IsValid() { if a.FieldByName(f).IsValid() {
// For now this just contains this item length, will adjust later // For now this just contains this item length, will adjust later
field.MaxLen = len(fmt.Sprintf("%v", a.Elem().FieldByName(f).Interface())) field.MaxLen = len(fmt.Sprintf("%v", a.FieldByName(f).Interface()))
field.Value = fmt.Sprintf("%v", a.Elem().FieldByName(f).Interface()) field.Value = fmt.Sprintf("%v", a.FieldByName(f).Interface())
} else {
fmt.Printf("Invalid field name: %s\n", f)
} }
line[i] = field line[i] = field
@ -145,7 +189,7 @@ func listJails(args []string) {
listJailsFromDatastore(d) listJailsFromDatastore(d)
} }
displayStructFields(gJails, []string{"JID", "Name", "Release", "RootPath"}) displayStructFields(gJails, []string{"JID", "Name", "Config.Release", "Config.Ip4_addr", "RootPath"})
} }