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 }