diff --git a/arrutil/format.go b/arrutil/format.go index 29048d613..5bceb7a9e 100644 --- a/arrutil/format.go +++ b/arrutil/format.go @@ -4,13 +4,13 @@ import ( "io" "reflect" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/strutil" ) // ArrFormatter struct type ArrFormatter struct { - common.BaseFormatter + comdef.BaseFormatter // Prefix string for each element Prefix string // Indent string for format each element @@ -58,6 +58,7 @@ func (f *ArrFormatter) Format() string { } // Format to string +// //goland:noinspection GoUnhandledErrorResult func (f *ArrFormatter) doFormat() { if f.Src == nil { diff --git a/internal/comfunc/convert.go b/internal/comfunc/convert.go index 3de4595c3..d23e689b1 100644 --- a/internal/comfunc/convert.go +++ b/internal/comfunc/convert.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" ) // Bool try to convert type to bool @@ -22,7 +22,7 @@ func ToBool(v interface{}) (bool, error) { if str, ok := v.(string); ok { return StrToBool(str) } - return false, common.ErrConvType + return false, comdef.ErrConvType } // StrToBool parse string to bool. like strconv.ParseBool() diff --git a/internal/gendoc/main.go b/internal/gendoc/main.go index 371659eeb..4bfeca465 100644 --- a/internal/gendoc/main.go +++ b/internal/gendoc/main.go @@ -23,6 +23,7 @@ import ( var ( hidden = []string{ "netutil", + "comdef", "common", "numbers", "internal", diff --git a/maputil/convert.go b/maputil/convert.go index 23aa03a60..231a7e62d 100644 --- a/maputil/convert.go +++ b/maputil/convert.go @@ -1,8 +1,11 @@ package maputil import ( + "reflect" + "strconv" "strings" + "github.com/gookit/goutil/reflects" "github.com/gookit/goutil/strutil" ) @@ -27,18 +30,6 @@ func ToStringMap(src map[string]any) map[string]string { return newMp } -// Flatten convert tree map to flat key-value map. -// -// Examples: -// -// {"top": {"sub": "value", "sub2": "value2"} } -// -> -// {"top.sub": "value", "top.sub2": "value2" } -func Flatten(mp map[string]any) map[string]interface{} { - // TODO convert - return mp -} - // HttpQueryString convert map[string]any data to http query string. func HttpQueryString(data map[string]any) string { ss := make([]string, 0, len(data)) @@ -84,3 +75,66 @@ func ToString2(mp any) string { func FormatIndent(mp any, indent string) string { return NewFormatter(mp).WithIndent(indent).Format() } + +/************************************************************* + * Flat convert tree map to flatten key-value map. + *************************************************************/ + +// Flatten convert tree map to flat key-value map. +// +// Examples: +// +// {"top": {"sub": "value", "sub2": "value2"} } +// -> +// {"top.sub": "value", "top.sub2": "value2" } +func Flatten(mp map[string]any) map[string]interface{} { + // TODO convert + return mp +} + +// FlatFunc custom collect handle func +type FlatFunc func(path string, val reflect.Value) + +// FlatWithFunc flat a tree-map with custom collect handle func +func FlatWithFunc(mp map[string]any, fn FlatFunc) { + if mp == nil { + return + } + + flatMap(reflect.ValueOf(mp), "", fn) +} + +func flatMap(rv reflect.Value, parent string, fn FlatFunc) { + for _, key := range rv.MapKeys() { + path := reflects.String(key) + if parent != "" { + path = parent + "." + path + } + + fv := reflects.Indirect(rv.MapIndex(key)) + switch fv.Kind() { + case reflect.Map: + flatMap(fv, path, fn) + case reflect.Array, reflect.Slice: + flatSlice(fv, path, fn) + default: + fn(path, fv) + } + } +} + +func flatSlice(rv reflect.Value, parent string, fn FlatFunc) { + for i := 0; i < rv.Len(); i++ { + path := parent + "[" + strconv.Itoa(i) + "]" + + fv := reflects.Indirect(rv.Index(i)) + switch fv.Kind() { + case reflect.Map: + flatMap(fv, path, fn) + case reflect.Array, reflect.Slice: + flatSlice(fv, path, fn) + default: + fn(path, fv) + } + } +} diff --git a/maputil/format.go b/maputil/format.go index 0695a85a0..96e5be3af 100644 --- a/maputil/format.go +++ b/maputil/format.go @@ -4,13 +4,13 @@ import ( "io" "reflect" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/strutil" ) // MapFormatter struct type MapFormatter struct { - common.BaseFormatter + comdef.BaseFormatter // Prefix string for each element Prefix string // Indent string for each element @@ -59,6 +59,7 @@ func (f *MapFormatter) Format() string { } // Format map data to string. +// //goland:noinspection GoUnhandledErrorResult func (f *MapFormatter) doFormat() { if f.Src == nil { diff --git a/mathutil/convert.go b/mathutil/convert.go index c99e2e604..d642328d3 100644 --- a/mathutil/convert.go +++ b/mathutil/convert.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" ) /************************************************************* @@ -83,7 +83,7 @@ func ToInt(in interface{}) (iVal int, err error) { i64, err = tVal.Int64() iVal = int(i64) default: - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -158,7 +158,7 @@ func ToUint(in interface{}) (u64 uint64, err error) { case string: u64, err = strconv.ParseUint(strings.TrimSpace(tVal), 10, 0) default: - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -227,7 +227,7 @@ func ToInt64(in interface{}) (i64 int64, err error) { case json.Number: i64, err = tVal.Int64() default: - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -303,7 +303,7 @@ func ToFloat(in interface{}) (f64 float64, err error) { case json.Number: f64, err = tVal.Float64() default: - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -387,7 +387,7 @@ func TryToString(val interface{}, defaultAsErr bool) (str string, err error) { str = value.String() default: if defaultAsErr { - err = common.ErrConvType + err = comdef.ErrConvType } else { str = fmt.Sprint(value) } diff --git a/mathutil/mathutil_test.go b/mathutil/mathutil_test.go index b91117675..c92746157 100644 --- a/mathutil/mathutil_test.go +++ b/mathutil/mathutil_test.go @@ -3,7 +3,7 @@ package mathutil_test import ( "testing" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/mathutil" "github.com/gookit/goutil/testutil/assert" ) @@ -34,31 +34,31 @@ func TestCompare(t *testing.T) { x, y interface{} op string }{ - {2, 2, common.OpEq}, - {2, 3, common.OpNeq}, - {2, 3, common.OpLt}, - {2, 3, common.OpLte}, - {2, 2, common.OpLte}, - {2, 1, common.OpGt}, - {2, 2, common.OpGte}, - {2, 1, common.OpGte}, - {2.2, 2.2, common.OpEq}, - {2.2, 3.1, common.OpNeq}, - {2.3, 3.2, common.OpLt}, - {2.3, 3.3, common.OpLte}, - {2.3, 2.3, common.OpLte}, - {2.3, 1.3, common.OpGt}, - {2.3, 2.3, common.OpGte}, - {2.3, 1.3, common.OpGte}, + {2, 2, comdef.OpEq}, + {2, 3, comdef.OpNeq}, + {2, 3, comdef.OpLt}, + {2, 3, comdef.OpLte}, + {2, 2, comdef.OpLte}, + {2, 1, comdef.OpGt}, + {2, 2, comdef.OpGte}, + {2, 1, comdef.OpGte}, + {2.2, 2.2, comdef.OpEq}, + {2.2, 3.1, comdef.OpNeq}, + {2.3, 3.2, comdef.OpLt}, + {2.3, 3.3, comdef.OpLte}, + {2.3, 2.3, comdef.OpLte}, + {2.3, 1.3, comdef.OpGt}, + {2.3, 2.3, comdef.OpGte}, + {2.3, 1.3, comdef.OpGte}, } for _, test := range tests { assert.True(t, mathutil.Compare(test.x, test.y, test.op)) } - assert.False(t, mathutil.Compare(2, 3, common.OpGt)) - assert.False(t, mathutil.Compare(nil, 3, common.OpGt)) - assert.False(t, mathutil.Compare(2, nil, common.OpGt)) - assert.False(t, mathutil.Compare("abc", 3, common.OpGt)) - assert.False(t, mathutil.Compare(2, "def", common.OpGt)) + assert.False(t, mathutil.Compare(2, 3, comdef.OpGt)) + assert.False(t, mathutil.Compare(nil, 3, comdef.OpGt)) + assert.False(t, mathutil.Compare(2, nil, comdef.OpGt)) + assert.False(t, mathutil.Compare("abc", 3, comdef.OpGt)) + assert.False(t, mathutil.Compare(2, "def", comdef.OpGt)) } diff --git a/reflects/conv.go b/reflects/conv.go index 089dd8602..899dd73ce 100644 --- a/reflects/conv.go +++ b/reflects/conv.go @@ -5,7 +5,7 @@ import ( "reflect" "strconv" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/internal/comfunc" "github.com/gookit/goutil/mathutil" "github.com/gookit/goutil/strutil" @@ -31,7 +31,7 @@ func BaseTypeVal(v reflect.Value) (value interface{}, err error) { case reflect.Float32, reflect.Float64: value = v.Float() default: - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -48,7 +48,7 @@ func ValueByType(val interface{}, typ reflect.Type) (rv reflect.Value, err error return newRv, nil } - err = common.ErrConvType + err = comdef.ErrConvType return } @@ -118,7 +118,7 @@ func ValueByKind(val interface{}, kind reflect.Kind) (rv reflect.Value, err erro } if !rv.IsValid() { - err = common.ErrConvType + err = comdef.ErrConvType } return } @@ -152,7 +152,7 @@ func ValToString(rv reflect.Value, defaultAsErr bool) (str string, err error) { str = strconv.FormatUint(rv.Uint(), 10) default: if defaultAsErr { - err = common.ErrConvType + err = comdef.ErrConvType } else { str = fmt.Sprint(rv.Interface()) } diff --git a/stdutil/convert_test.go b/stdutil/convert_test.go index 28ec0fcdd..89eb7ae3b 100644 --- a/stdutil/convert_test.go +++ b/stdutil/convert_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/stdutil" - "github.com/gookit/goutil/strutil" "github.com/gookit/goutil/testutil/assert" ) @@ -29,7 +29,7 @@ func TestTryString(t *testing.T) { assert.Eq(t, "23", s) s, err = stdutil.TryString([]string{"a", "b"}) - assert.Eq(t, err, strutil.ErrConvertFail) + assert.Eq(t, err, comdef.ErrConvType) assert.Eq(t, "", s) } diff --git a/strutil/convert.go b/strutil/convert.go index 87c95bcfe..01eb69c8b 100644 --- a/strutil/convert.go +++ b/strutil/convert.go @@ -11,7 +11,7 @@ import ( "time" "unsafe" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/internal/comfunc" "github.com/gookit/goutil/mathutil" ) @@ -152,7 +152,7 @@ func AnyToString(val interface{}, defaultAsErr bool) (str string, err error) { str = value.String() default: if defaultAsErr { - err = common.ErrConvType + err = comdef.ErrConvType } else { str = fmt.Sprint(value) } diff --git a/testutil/assert/util.go b/testutil/assert/util.go index 42d67ab1a..243a0f283 100644 --- a/testutil/assert/util.go +++ b/testutil/assert/util.go @@ -10,7 +10,7 @@ import ( "time" "github.com/gookit/color" - "github.com/gookit/goutil/common" + "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/fsutil" "github.com/gookit/goutil/mathutil" "github.com/gookit/goutil/reflects" @@ -152,7 +152,7 @@ func formatLabeledTexts(lts []labeledText) string { return sb.String() } -func formatMessage(message string, labelWidth int, buf common.StringWriteStringer) string { +func formatMessage(message string, labelWidth int, buf comdef.StringWriteStringer) string { for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { // skip add prefix for first line. if i != 0 {