From 26b2fecb366b1d528fe9304a76365e64b1d51abc Mon Sep 17 00:00:00 2001 From: eschao Date: Sun, 10 Dec 2017 11:33:03 +0800 Subject: [PATCH] update --- cli/cli.go | 118 ------------------------------------ cli/cli_test.go | 38 ------------ cmd/.cli.go.swp | Bin 0 -> 12288 bytes cmd/.cli_test.go.swp | Bin 0 -> 12288 bytes cmd/cmd.go | 139 +++++++++++++++++++++++++++++++++++++++++++ cmd/cmd_test.go | 120 +++++++++++++++++++++++++++++++++++++ main | Bin 0 -> 1760432 bytes main.go | 106 ++++++++++++++++++++++++++++++++- util/util.go | 113 +++++++++++++++++++++++++++++++++++ 9 files changed, 477 insertions(+), 157 deletions(-) delete mode 100644 cli/cli.go delete mode 100644 cli/cli_test.go create mode 100644 cmd/.cli.go.swp create mode 100644 cmd/.cli_test.go.swp create mode 100644 cmd/cmd.go create mode 100644 cmd/cmd_test.go create mode 100755 main create mode 100644 util/util.go diff --git a/cli/cli.go b/cli/cli.go deleted file mode 100644 index d5a9cde..0000000 --- a/cli/cli.go +++ /dev/null @@ -1,118 +0,0 @@ -package cli - -import ( - "flag" - "fmt" - "reflect" - "strings" -) - -type CliFlag struct { - Name string - Usage string - DefValue *string - CliFlags *[]CliFlag -} - -type ValueFlag struct { - Value reflect.Value -} - -func (this *ValueFlag) String() string { - return this.Value.Kind().String() -} - -func (this *ValueFlag) Set(v string) error { - return nil -} - -func Parse(i interface{}, cliFlag *CliFlag) error { - ptrRef := reflect.ValueOf(i) - - if ptrRef.IsNil() || ptrRef.Kind() != reflect.Ptr { - return fmt.Errorf("Expect a structure pointer type instead of %s", - ptrRef.Kind().String()) - } - - valueOfStruct := ptrRef.Elem() - if valueOfStruct.Kind() != reflect.Struct { - return fmt.Errorf("Expect a structure type instead of %s", - valueOfStruct.Kind().String()) - } - - return parseValue(valueOfStruct, cliFlag) -} - -func parseValue(v reflect.Value, cliParent *CliFlag) error { - cliFlags := []CliFlag{} - typeOfStruct := v.Type() - - for i := 0; i < v.NumField(); i++ { - valueOfField := v.Field(i) - kindOfField := valueOfField.Kind() - structOfField := typeOfStruct.Field(i) - - if kindOfField == reflect.Ptr { - if !valueOfField.IsNil() && valueOfField.CanSet() { - cliFlag := createCliFlagFromTag(structOfField.Tag) - if cliFlag != nil { - cliFlags = append(cliFlags, *cliFlag) - } else { - cliFlag = cliParent - } - Parse(valueOfField.Interface(), cliFlag) - } else { - continue - } - } else if kindOfField == reflect.Struct { - cliFlag := createCliFlagFromTag(structOfField.Tag) - if cliFlag != nil { - cliFlags = append(cliFlags, *cliFlag) - } else { - cliFlag = cliParent - } - parseValue(valueOfField, cliFlag) - } - - if cliFlag := installFlag(valueOfField, structOfField); cliFlag != nil { - cliFlags = append(cliFlags, *cliFlag) - } - } - - if len(cliFlags) > 0 { - cliParent.CliFlags = &cliFlags - } - return nil -} - -func installFlag(v reflect.Value, f reflect.StructField) *CliFlag { - cliFlag := createCliFlagFromTag(f.Tag) - if cliFlag != nil { - vFlag := ValueFlag{Value: v} - flag.Var(&vFlag, cliFlag.Name, cliFlag.Usage) - } - fmt.Printf("Installed flag: %d", cliFlag.Name) - return cliFlag -} - -func createCliFlagFromTag(tag reflect.StructTag) *CliFlag { - cliTag, ok := tag.Lookup("cli") - if !ok || cliTag == "" { - return nil - } - - cliFlag := CliFlag{} - firstSpace := strings.Index(cliTag, " ") - cliFlag.Name = cliTag - if firstSpace > 0 { - cliFlag.Name = cliTag[0:firstSpace] - cliFlag.Usage = cliTag[firstSpace+1:] - } - - defValue, ok := tag.Lookup("default") - if !ok { - cliFlag.DefValue = &defValue - } - - return &cliFlag -} diff --git a/cli/cli_test.go b/cli/cli_test.go deleted file mode 100644 index 3688c5a..0000000 --- a/cli/cli_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package cli - -import ( - "flag" - "fmt" - "testing" -) - -type DBCli struct { - Host string `cli:"hostname database server hostname"` - Port string `cli:"port database server port"` - User string `cli:"user database username"` - Password string `cli:"password database user password"` -} - -type MyCli struct { - Server string `cli:"-server server URL"` - DBCli DBCli `cli:"database database information"` -} - -func TestMain(m *testing.M) { -} - -func TestCli(t *testing.T) { - - hostname := flag.String("hostanme", "127.0.0.1", "hostanme value") - fmt.Printf("Hostname: %s", hostname) - - cli := DBCli{} - root := CliFlag{} - err := Parse(&cli, &root) - - if err != nil { - t.Errorf("Can't parse cli. %s", err.Error()) - } - flag.Parse() - -} diff --git a/cmd/.cli.go.swp b/cmd/.cli.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..be0262201596f2381ffa7b239f912e1f29f3cd3d GIT binary patch literal 12288 zcmeI2ONmGWit7kjgk4bm+ zxVUT#@#IMZdeg)s61`|bG`WSW4VXka`VLHtB0AnQNSo*6fg=H1&jhl0i%FX;4)Nzx7LtnFz>Z` z?uYbq&6217G!LVIQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2{)Y-UE+MBj-2Tp^}z}w&z z@En*09$;Vx7z7)@nRSG`2i^g%gX7>eFb@uZC&1m{)b)g%1RsF+!K)wz_kml%O<+Cv z@j60&0B67(;3zl(LNEsU!CJ5eoVu2fV}OHuK`*!q+yQSbJYZk~>;{A2Ht@&Qg!~H5f=|FPa2PxSc7t8u{8fZ}15Sby z;4Sbbcp8j>hrl4%00{UNvHco+1wI8Yg2P}2OaKx4eZc&T0!D#ugMP1>rmsAr`W7TQWLd*V5I=#ch;ZWq1@S34u37DI6e`B)s! zWi6|W|5XMjyew)^OY}m!L(oRT9L|OUzoR(X(S&&cYjAs2l91PxYqLb^5UDGM9>8>a;g~GAdW8Oa>98s*Dk2kR^H~d(ug)zP9*M^;MM;Fq4I1 z5|d7lF=4SF-|DoDv1>J#dGfnT)m%LrK6Yn|S|$t8^ z&T4nVsWtPu1uDKfeHOSC9ax=fksoOFAb3f|t=pjp%3e=4tBR~gj_6OsuCz#5kTQ{w zco%#En{l=LcF|Wh*e?GMbJ*dVE+(?3fX6*HlJlyc^{ zH1@CwmaB4EYmo~5Q)Kq?EG$?GHCjB`$2@yDU?C(?8%9YN{$od5G4^eiT-;$jKquvJ z)D(uy`#z@gN*M^3JF}8e+3Sg9S}~Mz75NZMFP(+O6+@`56=GSg?#zVbC4IousrY%= z16OgQ5beZKr5d4~xGJDfuiehUt>%IYioBWVBY)ZHm~$1U`?7HWz;WHjY5O>x!IM|8Uw9T_w+Y=w$lrQMz2 z#TJ)rU@u9NTZ%)&5F@V%iWnyKc+e{IDF$sk&$3K33MrCSI{Rj?7eG>;I`4bsm&ZhtX literal 0 HcmV?d00001 diff --git a/cmd/.cli_test.go.swp b/cmd/.cli_test.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..bfbceaec5d1b27ae4fe44ff79ef0cbc2d4019584 GIT binary patch literal 12288 zcmeI2%WvF79LFc+5f&&Q5Fo^5>WZ=nsU5%pepg&-d(F+d+{St z*hC0{df;C`ASA9Jap7@+16Lj=&cLM+0>q`jEtKzXJmY7j;_cO2j^751H_7Y=G!;WZpzfT48lGFZ@?TnvkU5$dQ=_S^@ zo!V9tvET2+YViMm z_4ogu4>EQO{0e>oKY}m7XW&!tKB$6e@Ye&3eGaz4>tGA4fjKY%ZXajtAFvC)1~