From db5b927acb097114dde3dc699f20cdb44a000300 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 15 Aug 2023 21:45:08 +0800 Subject: [PATCH] :sparkles: feat: cflag - add new built in ext type SafeFuncVar --- cflag/ext.go | 9 +++++++++ cflag/ext_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/cflag/ext.go b/cflag/ext.go index ad591114f..4c34e8efe 100644 --- a/cflag/ext.go +++ b/cflag/ext.go @@ -474,3 +474,12 @@ func (s *ConfString) Set(value string) error { } return nil } + +// SafeFuncVar safe func Value +type SafeFuncVar func(string) + +// Set value +func (f SafeFuncVar) Set(s string) error { f(s); return nil } + +// String get +func (f SafeFuncVar) String() string { return "" } diff --git a/cflag/ext_test.go b/cflag/ext_test.go index 7d6212a2e..0db5c796d 100644 --- a/cflag/ext_test.go +++ b/cflag/ext_test.go @@ -2,6 +2,7 @@ package cflag_test import ( "errors" + "flag" "testing" "github.com/gookit/goutil/cflag" @@ -150,6 +151,18 @@ func TestStrings_methods(t *testing.T) { assert.NoErr(t, ss.Set("val2")) assert.Eq(t, "val,val2", ss.String()) assert.True(t, ss.IsRepeatable()) + + var v1 any + + v1 = &cflag.Strings{} + val, ok := v1.(flag.Value) + assert.True(t, ok) + assert.NotNil(t, val) + + v1 = cflag.Strings{} + val, ok = v1.(flag.Value) + assert.False(t, ok) + assert.Nil(t, val) } func TestBooleans_methods(t *testing.T) { @@ -162,3 +175,14 @@ func TestBooleans_methods(t *testing.T) { assert.Eq(t, "[true,false]", bs.String()) assert.True(t, bs.IsRepeatable()) } + +func TestSafeFuncVar(t *testing.T) { + var s string + fv := cflag.SafeFuncVar(func(val string) { + s = val + }) + + assert.NoErr(t, fv.Set("val")) + assert.Eq(t, "val", s) + assert.Eq(t, "", fv.String()) +}