sing/common/format/fmt.go
2023-03-24 07:09:09 +08:00

73 lines
1.6 KiB
Go

package format
import (
"strconv"
"github.com/sagernet/sing/common"
)
type Stringer interface {
String() string
}
func ToString(messages ...any) string {
var output string
for _, rawMessage := range messages {
if rawMessage == nil {
output += "nil"
continue
}
switch message := rawMessage.(type) {
case string:
output += message
case bool:
if message {
output += "true"
} else {
output += "false"
}
case uint:
output += strconv.FormatUint(uint64(message), 10)
case uint8:
output += strconv.FormatUint(uint64(message), 10)
case uint16:
output += strconv.FormatUint(uint64(message), 10)
case uint32:
output += strconv.FormatUint(uint64(message), 10)
case uint64:
output += strconv.FormatUint(message, 10)
case int:
output += strconv.FormatInt(int64(message), 10)
case int8:
output += strconv.FormatInt(int64(message), 10)
case int16:
output += strconv.FormatInt(int64(message), 10)
case int32:
output += strconv.FormatInt(int64(message), 10)
case int64:
output += strconv.FormatInt(message, 10)
case uintptr:
output += strconv.FormatUint(uint64(message), 10)
case error:
output += message.Error()
case Stringer:
output += message.String()
default:
panic("unknown value")
}
}
return output
}
func ToString0[T any](message T) string {
return ToString(message)
}
func MapToString[T any](arr []T) []string {
return common.Map(arr, ToString0[T])
}
func Seconds(seconds float64) string {
seconds100 := int(seconds * 100)
return ToString(seconds100/100, ".", seconds100%100, seconds100%10)
}