|
|
|
@@ -0,0 +1,83 @@ |
|
|
|
package logger |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"reflect" |
|
|
|
"strings" |
|
|
|
) |
|
|
|
|
|
|
|
type structFormatter struct { |
|
|
|
val any |
|
|
|
} |
|
|
|
|
|
|
|
func (f *structFormatter) String() string { |
|
|
|
typ := reflect.TypeOf(f.val) |
|
|
|
val := reflect.ValueOf(f.val) |
|
|
|
|
|
|
|
kind := typ.Kind() |
|
|
|
|
|
|
|
if kind != reflect.Struct { |
|
|
|
return fmt.Sprintf("%v", f.val) |
|
|
|
} |
|
|
|
|
|
|
|
strBuilder := strings.Builder{} |
|
|
|
for i := 0; i < val.NumField(); i++ { |
|
|
|
fieldInfo := typ.Field(i) |
|
|
|
fieldValue := val.Field(i) |
|
|
|
fieldType := fieldInfo.Type |
|
|
|
fieldKind := fieldType.Kind() |
|
|
|
|
|
|
|
switch fieldKind { |
|
|
|
case reflect.Slice: |
|
|
|
fallthrough |
|
|
|
case reflect.Array: |
|
|
|
if i > 0 { |
|
|
|
strBuilder.WriteString(", ") |
|
|
|
} |
|
|
|
|
|
|
|
strBuilder.WriteString("len(") |
|
|
|
strBuilder.WriteString(fieldInfo.Name) |
|
|
|
strBuilder.WriteString("): ") |
|
|
|
strBuilder.WriteString(fmt.Sprintf("%d", fieldValue.Len())) |
|
|
|
|
|
|
|
case reflect.Struct: |
|
|
|
if i > 0 { |
|
|
|
strBuilder.WriteString(", ") |
|
|
|
} |
|
|
|
|
|
|
|
strBuilder.WriteString(fieldInfo.Name) |
|
|
|
strBuilder.WriteString(": <") |
|
|
|
strBuilder.WriteString(fieldType.Name()) |
|
|
|
strBuilder.WriteString(">") |
|
|
|
|
|
|
|
case reflect.Pointer: |
|
|
|
if i > 0 { |
|
|
|
strBuilder.WriteString(", ") |
|
|
|
} |
|
|
|
strBuilder.WriteString(fieldInfo.Name) |
|
|
|
if fieldValue.IsNil() { |
|
|
|
strBuilder.WriteString(": <nil>") |
|
|
|
} else { |
|
|
|
strBuilder.WriteString(": &<") |
|
|
|
strBuilder.WriteString(fieldType.Elem().Name()) |
|
|
|
strBuilder.WriteString(">") |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
if i > 0 { |
|
|
|
strBuilder.WriteString(", ") |
|
|
|
} |
|
|
|
strBuilder.WriteString(fieldInfo.Name) |
|
|
|
strBuilder.WriteString(": ") |
|
|
|
strBuilder.WriteString(fmt.Sprintf("%v", fieldValue)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return strBuilder.String() |
|
|
|
} |
|
|
|
|
|
|
|
func FormatStruct(val any) any { |
|
|
|
return &structFormatter{ |
|
|
|
val: val, |
|
|
|
} |
|
|
|
} |