63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package tools
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"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 []any:
|
|
var o []byte
|
|
o, err = json.Marshal(v)
|
|
if err == nil {
|
|
return buff.Write(o)
|
|
}
|
|
case map[string]any:
|
|
var o []byte
|
|
o, err = json.Marshal(v)
|
|
if err == nil {
|
|
return buff.Write(o)
|
|
}
|
|
case string:
|
|
if strings.HasPrefix(v, "!") {
|
|
return buff.WriteString(strings.TrimPrefix(v, "!"))
|
|
}
|
|
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:
|
|
if v[0] == '!' {
|
|
return buff.Write(v[1:])
|
|
}
|
|
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
|
|
}
|