diff --git a/envutil/envutil_test.go b/envutil/envutil_test.go index e66c2f3d6..86dec11a9 100644 --- a/envutil/envutil_test.go +++ b/envutil/envutil_test.go @@ -50,7 +50,7 @@ func TestParseEnvValue(t *testing.T) { }, func() { is.Eq("abc", Getenv("FirstEnv")) is.Eq("def", Getenv("SecondEnv")) - is.Eq("abc/def", ParseEnvValue(rVal)) + is.Eq("abc/def", ParseValue(rVal)) is.Eq("abc string", VarReplace("${FirstEnv} string")) }) diff --git a/structs/tags.go b/structs/tags.go index 96468cb37..2586b9514 100644 --- a/structs/tags.go +++ b/structs/tags.go @@ -6,6 +6,7 @@ import ( "reflect" "strings" + "github.com/gookit/goutil/arrutil" "github.com/gookit/goutil/maputil" "github.com/gookit/goutil/strutil" ) @@ -208,7 +209,9 @@ func ParseTagValueDefault(field, tagVal string) (mp maputil.SMap, err error) { // Examples: // // eg: "desc;required;default;shorts" -// type My +// type MyStruct { +// Age int `flag:"int option message;;a,b"` +// } // sepStr := ";" // defines := []string{"desc", "required", "default", "shorts"} func ParseTagValueDefine(sep string, defines []string) TagValFunc { @@ -233,7 +236,7 @@ func ParseTagValueDefine(sep string, defines []string) TagValFunc { // ParseTagValueNamed parse k-v tag value string. it's like INI format contents. // // eg: "name=int0;shorts=i;required=true;desc=int option message" -func ParseTagValueNamed(field, tagVal string) (mp maputil.SMap, err error) { +func ParseTagValueNamed(field, tagVal string, keys ...string) (mp maputil.SMap, err error) { ss := strutil.Split(tagVal, ";") ln := len(ss) if ln == 0 { @@ -249,6 +252,10 @@ func ParseTagValueNamed(field, tagVal string) (mp maputil.SMap, err error) { kvNodes := strings.SplitN(s, "=", 2) key, val := kvNodes[0], strings.TrimSpace(kvNodes[1]) + if len(keys) > 0 && !arrutil.StringsHas(keys, key) { + err = fmt.Errorf("parse tag error on field '%s': invalid key name '%s'", field, key) + return + } mp[key] = val } diff --git a/structs/tags_test.go b/structs/tags_test.go index d0826ed56..a4d83ef05 100644 --- a/structs/tags_test.go +++ b/structs/tags_test.go @@ -212,4 +212,7 @@ func TestParseTagValueNamed(t *testing.T) { assert.NoErr(t, err) assert.NotEmpty(t, mp) assert.Eq(t, "inhere", mp.Str("default")) + + mp, err = structs.ParseTagValueNamed("name", "name=n;default=inhere", "name") + assert.ErrSubMsg(t, err, "parse tag error on field 'name'") }