initial implementation #1

Closed
opened 2021-02-02 13:18:48 +03:00 by vtolstov · 1 comment
vtolstov commented 2021-02-02 13:18:48 +03:00 (Migrated from github.com)

https://tip.golang.org/pkg/flag/#Func
and

package main

import (
        "flag"
        "fmt"
        "reflect"

        rutil "github.com/unistack-org/micro/v3/util/reflect"
)

type Config struct {
        Broker string `flag:"name=broker,desc='description with, comma',default='127.0.0.1:9092'"`
}

type StructField struct {
        Field reflect.StructField
        Value reflect.Value
}

func StructFields(src interface{}) ([]StructField, error) {
        var fields []StructField

        sv := reflect.ValueOf(src)
        if sv.Kind() == reflect.Ptr {
                sv = sv.Elem()
        }
        if sv.Kind() != reflect.Struct {
                return nil, rutil.ErrInvalidStruct
        }
       typ := sv.Type()
        for idx := 0; idx < typ.NumField(); idx++ {
                fld := typ.Field(idx)
                val := sv.Field(idx)
                if !val.CanSet() || len(fld.PkgPath) != 0 {
                        continue
                }
                if val.Kind() == reflect.Struct {
                        infields, err := StructFields(val.Interface())
                        if err != nil {
                                return nil, err
                        }
                        fields = append(fields, infields...)
                } else {
                        fields = append(fields, StructField{Field: fld, Value: val})
                }
        }

        return fields, nil
}

func main() {
        cfg := &Config{}

        fields, err := StructFields(cfg)
        if err != nil {
                panic(err)
        }

        for _, field := range fields {
                switch field.Value.Kind() {
                case reflect.String:
                        v := field.Value.String()
                        flag.StringVar(&v, "name", "127.0.0.1:9092", "help message for flagname")
                }
                fmt.Printf("%#+v\n", field)
        }

        visitFn := func(f *flag.Flag) {
                fmt.Printf("XXXX %#+v %s\n", f, f.Value.String())
        }

        flag.Parse()
        flag.VisitAll(visitFn)
}
https://tip.golang.org/pkg/flag/#Func and ```go package main import ( "flag" "fmt" "reflect" rutil "github.com/unistack-org/micro/v3/util/reflect" ) type Config struct { Broker string `flag:"name=broker,desc='description with, comma',default='127.0.0.1:9092'"` } type StructField struct { Field reflect.StructField Value reflect.Value } func StructFields(src interface{}) ([]StructField, error) { var fields []StructField sv := reflect.ValueOf(src) if sv.Kind() == reflect.Ptr { sv = sv.Elem() } if sv.Kind() != reflect.Struct { return nil, rutil.ErrInvalidStruct } typ := sv.Type() for idx := 0; idx < typ.NumField(); idx++ { fld := typ.Field(idx) val := sv.Field(idx) if !val.CanSet() || len(fld.PkgPath) != 0 { continue } if val.Kind() == reflect.Struct { infields, err := StructFields(val.Interface()) if err != nil { return nil, err } fields = append(fields, infields...) } else { fields = append(fields, StructField{Field: fld, Value: val}) } } return fields, nil } func main() { cfg := &Config{} fields, err := StructFields(cfg) if err != nil { panic(err) } for _, field := range fields { switch field.Value.Kind() { case reflect.String: v := field.Value.String() flag.StringVar(&v, "name", "127.0.0.1:9092", "help message for flagname") } fmt.Printf("%#+v\n", field) } visitFn := func(f *flag.Flag) { fmt.Printf("XXXX %#+v %s\n", f, f.Value.String()) } flag.Parse() flag.VisitAll(visitFn) } ```
vtolstov commented 2021-06-18 16:48:24 +03:00 (Migrated from github.com)

done

done
Sign in to join this conversation.
No description provided.