I have a struct like this
type duration struct {
time.Duration
}
and another one like that
type Config struct {
Announce duration
}
I am using reflection to assign flags to the fields of the struct Config. However, with the particular use case of the type duration
, i am stuck.
The problem is that when i do a switch type, i got *config.duration
instead of *time.Duration
. How can i access the anonymous field ?
Here is the full code
func assignFlags(v interface{}) {
// Dereference into an adressable value
xv := reflect.ValueOf(v).Elem()
xt := xv.Type()
for i := 0; i < xt.NumField(); i++ {
f := xt.Field(i)
// Get tags for this field
name := f.Tag.Get("long")
short := f.Tag.Get("short")
usage := f.Tag.Get("usage")
addr := xv.Field(i).Addr().Interface()
// Assign field to a flag
switch ptr := addr.(type) { // i get `*config.duration` here
case *time.Duration:
if len(short) > 0 {
// note that this is not flag, but pflag library. The type of the first argument muste be `*time.Duration`
flag.DurationVarP(ptr, name, short, 0, usage)
} else {
flag.DurationVar(ptr, name, 0, usage)
}
}
}
}
Thanks