diff --git a/README.md b/README.md index 0ac323d5e..0a77efb64 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,8 @@ ss, err := arrutil.ToStrings([]int{1, 2}) // ss: []string{"1", "2"} func NewBuffer() *Buffer // source at byteutil/byteutil.go func FirstLine(bs []byte) []byte +func StrOrErr(bs []byte, err error) (string, error) +func SafeString(bs []byte, err error) string // source at byteutil/bytex.go func Md5(src any) []byte // source at byteutil/encoder.go @@ -1163,6 +1165,7 @@ func SplitInlineComment(val string) (string, string) func FirstLine(output string) string // source at strutil/strutil.go func OrElse(s, newVal string) string +func Valid(ss ...string) string func Replaces(str string, pairs map[string]string) string func PrettyJSON(v any) (string, error) func RenderTemplate(input string, data any, fns template.FuncMap, isFile ...bool) string diff --git a/README.zh-CN.md b/README.zh-CN.md index f177e6d50..11f4d7478 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -177,6 +177,8 @@ ss, err := arrutil.ToStrings([]int{1, 2}) // ss: []string{"1", "2"} func NewBuffer() *Buffer // source at byteutil/byteutil.go func FirstLine(bs []byte) []byte +func StrOrErr(bs []byte, err error) (string, error) +func SafeString(bs []byte, err error) string // source at byteutil/bytex.go func Md5(src any) []byte // source at byteutil/encoder.go @@ -1164,6 +1166,7 @@ func SplitInlineComment(val string) (string, string) func FirstLine(output string) string // source at strutil/strutil.go func OrElse(s, newVal string) string +func Valid(ss ...string) string func Replaces(str string, pairs map[string]string) string func PrettyJSON(v any) (string, error) func RenderTemplate(input string, data any, fns template.FuncMap, isFile ...bool) string diff --git a/envutil/envutil_test.go b/envutil/envutil_test.go index 86dec11a9..bbe91f06c 100644 --- a/envutil/envutil_test.go +++ b/envutil/envutil_test.go @@ -13,7 +13,7 @@ func TestParseEnvValue(t *testing.T) { eKey, eVal, rVal, nVal string }{ {"EnvKey", "EnvKey val", "${EnvKey}", "EnvKey val"}, - {"EnvKey", "", "${EnvKey}", "${EnvKey}"}, + {"EnvKey", "", "${EnvKey}", ""}, {"EnvKey0", "EnvKey0 val", "${ EnvKey0 }", "EnvKey0 val"}, {"EnvKey1", "EnvKey1 val", "${EnvKey1|defValue}", "EnvKey1 val"}, {"EnvKey1", "", "${EnvKey1|defValue}", "defValue"}, @@ -38,11 +38,12 @@ func TestParseEnvValue(t *testing.T) { } // test multi ENV key - rVal := "${FirstEnv}/${ SecondEnv }" + rVal := "${FirstEnv}/${ SecondEnv | def_val}" is.Eq("", Getenv("FirstEnv")) is.Eq("", Getenv("SecondEnv")) - is.Eq(rVal, ParseEnvValue(rVal)) - is.Eq(rVal, VarParse(rVal)) + is.Eq("/def_val", ParseEnvValue(rVal)) + is.Eq("/def_val", VarParse(rVal)) + is.Eq("/", VarReplace(rVal)) // use os.ExpandEnv() testutil.MockEnvValues(map[string]string{ "FirstEnv": "abc", @@ -59,6 +60,6 @@ func TestParseEnvValue(t *testing.T) { }, func() { is.Eq("abc", Getenv("FirstEnv")) is.Eq("", Getenv("SecondEnv")) - is.Eq("abc/${ SecondEnv }", ParseEnvValue(rVal)) + is.Eq("abc/def_val", ParseEnvValue(rVal)) }) } diff --git a/strutil/value.go b/strutil/value.go index 3ae2e87fd..73c31aa7b 100644 --- a/strutil/value.go +++ b/strutil/value.go @@ -15,79 +15,84 @@ func (s *Value) Set(val string) error { } // IsEmpty check -func (s *Value) IsEmpty() bool { - return string(*s) == "" +func (s Value) IsEmpty() bool { + return string(s) == "" +} + +// IsBlank check +func (s Value) IsBlank() bool { + return strings.TrimSpace(string(s)) == "" } // IsStartWith prefix -func (s *Value) IsStartWith(sub string) bool { - return strings.HasPrefix(string(*s), sub) +func (s Value) IsStartWith(sub string) bool { + return strings.HasPrefix(string(s), sub) } // HasPrefix prefix -func (s *Value) HasPrefix(sub string) bool { - return strings.HasPrefix(string(*s), sub) +func (s Value) HasPrefix(sub string) bool { + return strings.HasPrefix(string(s), sub) } // IsEndWith suffix -func (s *Value) IsEndWith(sub string) bool { - return strings.HasSuffix(string(*s), sub) +func (s Value) IsEndWith(sub string) bool { + return strings.HasSuffix(string(s), sub) } // HasSuffix suffix -func (s *Value) HasSuffix(sub string) bool { - return strings.HasSuffix(string(*s), sub) +func (s Value) HasSuffix(sub string) bool { + return strings.HasSuffix(string(s), sub) } // Bytes string to bytes -func (s *Value) Bytes() []byte { - return []byte(*s) +func (s Value) Bytes() []byte { + return []byte(s) } // Val string -func (s *Value) Val() string { - return string(*s) +func (s Value) Val() string { + return string(s) } // Int convert -func (s *Value) Int() int { - return QuietInt(string(*s)) +func (s Value) Int() int { + return QuietInt(string(s)) } // Int64 convert -func (s *Value) Int64() int64 { - return QuietInt64(string(*s)) +func (s Value) Int64() int64 { + return QuietInt64(string(s)) } // Bool convert -func (s *Value) Bool() bool { - return QuietBool(string(*s)) +func (s Value) Bool() bool { + return QuietBool(string(s)) } // Value string -func (s *Value) String() string { - return string(*s) +func (s Value) String() string { + return string(s) } // OrElse string -func (s *Value) OrElse(or string) string { - if *s != "" { - return string(*s) +func (s Value) OrElse(or string) string { + if s != "" { + return string(s) } return or } // Split string -func (s *Value) Split(sep string) []string { - return strings.Split(string(*s), sep) +func (s Value) Split(sep string) []string { + return strings.Split(string(s), sep) } // SplitN string -func (s *Value) SplitN(sep string, n int) []string { - return strings.SplitN(string(*s), sep, n) +func (s Value) SplitN(sep string, n int) []string { + return strings.SplitN(string(s), sep, n) } -// TrimSpace string and return new -func (s *Value) TrimSpace() Value { - return Value(strings.TrimSpace(string(*s))) +// WithTrimSpace string and return new +func (s Value) WithTrimSpace() Value { + return Value(strings.TrimSpace(string(s))) } diff --git a/strutil/value_test.go b/strutil/value_test.go index c7a057d64..a46ba11a0 100644 --- a/strutil/value_test.go +++ b/strutil/value_test.go @@ -13,12 +13,17 @@ func TestValue_usage(t *testing.T) { assert.True(t, s.HasPrefix("abc")) assert.True(t, s.IsEndWith("123")) assert.True(t, s.HasSuffix("123")) + assert.False(t, s.IsEmpty()) + assert.False(t, s.IsBlank()) assert.Eq(t, "abc-123", s.Val()) assert.Eq(t, "abc-123", s.String()) + assert.Eq(t, "abc-123", s.OrElse("def")) s1 := strutil.StrVal("abc-123") assert.NotEmpty(t, s1.Val()) assert.Len(t, s1.Split("-"), 2) assert.Len(t, s1.SplitN("-", 2), 2) + + assert.Eq(t, "abc", strutil.Value(" abc ").WithTrimSpace().Val()) }