github.com/sagernet/sing@v0.2.6/common/format/fmt.go (about) 1 package format 2 3 import ( 4 "strconv" 5 6 "github.com/sagernet/sing/common" 7 ) 8 9 type Stringer interface { 10 String() string 11 } 12 13 func ToString(messages ...any) string { 14 var output string 15 for _, rawMessage := range messages { 16 if rawMessage == nil { 17 output += "nil" 18 continue 19 } 20 switch message := rawMessage.(type) { 21 case string: 22 output += message 23 case bool: 24 if message { 25 output += "true" 26 } else { 27 output += "false" 28 } 29 case uint: 30 output += strconv.FormatUint(uint64(message), 10) 31 case uint8: 32 output += strconv.FormatUint(uint64(message), 10) 33 case uint16: 34 output += strconv.FormatUint(uint64(message), 10) 35 case uint32: 36 output += strconv.FormatUint(uint64(message), 10) 37 case uint64: 38 output += strconv.FormatUint(message, 10) 39 case int: 40 output += strconv.FormatInt(int64(message), 10) 41 case int8: 42 output += strconv.FormatInt(int64(message), 10) 43 case int16: 44 output += strconv.FormatInt(int64(message), 10) 45 case int32: 46 output += strconv.FormatInt(int64(message), 10) 47 case int64: 48 output += strconv.FormatInt(message, 10) 49 case uintptr: 50 output += strconv.FormatUint(uint64(message), 10) 51 case error: 52 output += message.Error() 53 case Stringer: 54 output += message.String() 55 default: 56 panic("unknown value") 57 } 58 } 59 return output 60 } 61 62 func ToString0[T any](message T) string { 63 return ToString(message) 64 } 65 66 func MapToString[T any](arr []T) []string { 67 return common.Map(arr, ToString0[T]) 68 } 69 70 func Seconds(seconds float64) string { 71 seconds100 := int(seconds * 100) 72 return ToString(seconds100/100, ".", seconds100%100, seconds100%10) 73 }