From 0db3a9f0f6b6173cc3aa4cb1f9a7933e91d91c53 Mon Sep 17 00:00:00 2001 From: John Guo Date: Wed, 24 Nov 2021 22:27:09 +0800 Subject: [PATCH] improve package gcmd --- os/gcmd/gcmd_command_object.go | 60 ++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/os/gcmd/gcmd_command_object.go b/os/gcmd/gcmd_command_object.go index 7f6a6abf8..4957d6cd2 100644 --- a/os/gcmd/gcmd_command_object.go +++ b/os/gcmd/gcmd_command_object.go @@ -246,6 +246,42 @@ func newCommandFromMethod(object interface{}, method reflect.Value) (command Com return } +func newOptionsFromInput(object interface{}) (options []Option, err error) { + var ( + fields []gstructs.Field + ) + fields, err = gstructs.Fields(gstructs.FieldsInput{ + Pointer: object, + RecursiveOption: gstructs.RecursiveOptionEmbeddedNoTag, + }) + for _, field := range fields { + var ( + option = Option{} + metaData = field.TagMap() + ) + if err = gconv.Scan(metaData, &option); err != nil { + return nil, err + } + if option.Name == "" { + option.Name = field.Name() + } + if option.Name == helpOptionName { + return nil, gerror.Newf( + `option name "%s" is already token by built-in options`, + option.Name, + ) + } + if option.Short == helpOptionNameShort { + return nil, gerror.Newf( + `short option name "%s" is already token by built-in options`, + option.Short, + ) + } + options = append(options, option) + } + return +} + // mergeDefaultStructValue merges the request parameters with default values from struct tag definition. func mergeDefaultStructValue(data map[string]interface{}, pointer interface{}) error { tagFields, err := gstructs.TagFields(pointer, defaultValueTags) @@ -270,27 +306,3 @@ func mergeDefaultStructValue(data map[string]interface{}, pointer interface{}) e } return nil } - -func newOptionsFromInput(object interface{}) (options []Option, err error) { - var ( - fields []gstructs.Field - ) - fields, err = gstructs.Fields(gstructs.FieldsInput{ - Pointer: object, - RecursiveOption: gstructs.RecursiveOptionEmbeddedNoTag, - }) - for _, field := range fields { - var ( - option = Option{} - metaData = field.TagMap() - ) - if err = gconv.Scan(metaData, &option); err != nil { - return nil, err - } - if option.Name == "" { - option.Name = field.Name() - } - options = append(options, option) - } - return -}