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) if 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 int8: return strconv.Itoa(int(vt)) case int16: return strconv.Itoa(int(vt)) case int32: return strconv.Itoa(int(vt)) case int64: return strconv.FormatInt(vt, 10) 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()) } }