45 lines
885 B
Go
45 lines
885 B
Go
|
|
package tools
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
"strconv"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
func WriteValue(buff *bytes.Buffer, val any) (n int, err error) {
|
||
|
|
switch v := val.(type) {
|
||
|
|
default:
|
||
|
|
err = fmt.Errorf("Unsupported type %T", v)
|
||
|
|
case nil:
|
||
|
|
return
|
||
|
|
case string:
|
||
|
|
return buff.WriteString(v)
|
||
|
|
case int:
|
||
|
|
return buff.WriteString(strconv.Itoa(v))
|
||
|
|
case int64:
|
||
|
|
return buff.WriteString(strconv.FormatInt(v, 10))
|
||
|
|
case float64:
|
||
|
|
return buff.WriteString(strconv.FormatFloat(v, 'f', -1, 64))
|
||
|
|
case json.Number:
|
||
|
|
return buff.WriteString(v.String())
|
||
|
|
case json.RawMessage:
|
||
|
|
return buff.Write(v)
|
||
|
|
case []byte:
|
||
|
|
return buff.Write(v)
|
||
|
|
case byte:
|
||
|
|
err = buff.WriteByte(v)
|
||
|
|
if err == nil {
|
||
|
|
n = 1
|
||
|
|
}
|
||
|
|
case rune:
|
||
|
|
return buff.WriteString(string(v))
|
||
|
|
case bool:
|
||
|
|
return buff.WriteString(strconv.FormatBool(v))
|
||
|
|
case time.Time:
|
||
|
|
return buff.WriteString(v.Format(time.RFC3339))
|
||
|
|
}
|
||
|
|
return
|
||
|
|
}
|