You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.3 KiB
67 lines
1.3 KiB
package lang |
|
|
|
import ( |
|
"fmt" |
|
"reflect" |
|
"strconv" |
|
) |
|
|
|
var Placeholder PlaceholderType |
|
|
|
type ( |
|
AnyType = any |
|
PlaceholderType = struct{} |
|
) |
|
|
|
func Repr(v any) string { |
|
if v == nil { |
|
return "" |
|
} |
|
switch vt := v.(type) { |
|
case fmt.Stringer: |
|
return vt.String() |
|
} |
|
val := reflect.ValueOf(v) |
|
for val.Kind() == reflect.Ptr && !val.IsNil() { |
|
val = val.Elem() |
|
} |
|
return reprOfValue(val) |
|
} |
|
func reprOfValue(val reflect.Value) string { |
|
switch vt := val.Interface().(type) { |
|
case bool: |
|
return strconv.FormatBool(vt) |
|
case error: |
|
return vt.Error() |
|
case float32: |
|
return strconv.FormatFloat(float64(vt), 'f', -1, 32) |
|
case float64: |
|
return strconv.FormatFloat(vt, 'f', -1, 64) |
|
case fmt.Stringer: |
|
return vt.String() |
|
case int: |
|
return strconv.Itoa(vt) |
|
case int16: |
|
return strconv.Itoa(int(vt)) |
|
case int32: |
|
return strconv.Itoa(int(vt)) |
|
case int64: |
|
return strconv.Itoa(int(vt)) |
|
case string: |
|
return vt |
|
case uint: |
|
return strconv.FormatUint(uint64(vt), 10) |
|
case uint8: |
|
return strconv.FormatUint(uint64(vt), 10) |
|
case uint16: |
|
return strconv.FormatUint(uint64(vt), 10) |
|
case uint32: |
|
return strconv.FormatUint(uint64(vt), 10) |
|
case uint64: |
|
return strconv.FormatUint(vt, 10) |
|
case []byte: |
|
return string(vt) |
|
default: |
|
return fmt.Sprint(val.Interface()) |
|
} |
|
}
|
|
|