1package internal
2
3import (
4	"fmt"
5	"strconv"
6	"time"
7)
8
9func AppendArg(b []byte, v interface{}) []byte {
10	switch v := v.(type) {
11	case nil:
12		return append(b, "<nil>"...)
13	case string:
14		return appendUTF8String(b, Bytes(v))
15	case []byte:
16		return appendUTF8String(b, v)
17	case int:
18		return strconv.AppendInt(b, int64(v), 10)
19	case int8:
20		return strconv.AppendInt(b, int64(v), 10)
21	case int16:
22		return strconv.AppendInt(b, int64(v), 10)
23	case int32:
24		return strconv.AppendInt(b, int64(v), 10)
25	case int64:
26		return strconv.AppendInt(b, v, 10)
27	case uint:
28		return strconv.AppendUint(b, uint64(v), 10)
29	case uint8:
30		return strconv.AppendUint(b, uint64(v), 10)
31	case uint16:
32		return strconv.AppendUint(b, uint64(v), 10)
33	case uint32:
34		return strconv.AppendUint(b, uint64(v), 10)
35	case uint64:
36		return strconv.AppendUint(b, v, 10)
37	case float32:
38		return strconv.AppendFloat(b, float64(v), 'f', -1, 64)
39	case float64:
40		return strconv.AppendFloat(b, v, 'f', -1, 64)
41	case bool:
42		if v {
43			return append(b, "true"...)
44		}
45		return append(b, "false"...)
46	case time.Time:
47		return v.AppendFormat(b, time.RFC3339Nano)
48	default:
49		return append(b, fmt.Sprint(v)...)
50	}
51}
52
53func appendUTF8String(dst []byte, src []byte) []byte {
54	dst = append(dst, src...)
55	return dst
56}
57