♻️ Add tools.WriteValue
This commit is contained in:
parent
fd5d315164
commit
286ac4557d
4 changed files with 97 additions and 31 deletions
|
|
@ -2,12 +2,9 @@ package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"codeberg.org/danjones000/my-log/tools"
|
"codeberg.org/danjones000/my-log/tools"
|
||||||
)
|
)
|
||||||
|
|
@ -25,33 +22,9 @@ func (m Meta) MarshalText() ([]byte, error) {
|
||||||
buff.WriteRune('@')
|
buff.WriteRune('@')
|
||||||
buff.WriteString(m.Key)
|
buff.WriteString(m.Key)
|
||||||
buff.WriteRune(' ')
|
buff.WriteRune(' ')
|
||||||
switch v := m.Value.(type) {
|
n, err := tools.WriteValue(buff, m.Value)
|
||||||
default:
|
if n == 0 || err != nil {
|
||||||
return nil, fmt.Errorf("Unknown type %T", v)
|
return []byte{}, err
|
||||||
case nil:
|
|
||||||
return []byte{}, nil
|
|
||||||
case string:
|
|
||||||
buff.WriteString(v)
|
|
||||||
case int:
|
|
||||||
buff.WriteString(strconv.Itoa(v))
|
|
||||||
case int64:
|
|
||||||
buff.WriteString(strconv.FormatInt(v, 10))
|
|
||||||
case float64:
|
|
||||||
buff.WriteString(strconv.FormatFloat(v, 'f', -1, 64))
|
|
||||||
case json.Number:
|
|
||||||
buff.WriteString(v.String())
|
|
||||||
case json.RawMessage:
|
|
||||||
buff.Write(v)
|
|
||||||
case []byte:
|
|
||||||
buff.Write(v)
|
|
||||||
case byte:
|
|
||||||
buff.WriteByte(v)
|
|
||||||
case rune:
|
|
||||||
buff.WriteString(string(v))
|
|
||||||
case bool:
|
|
||||||
buff.WriteString(strconv.FormatBool(v))
|
|
||||||
case time.Time:
|
|
||||||
buff.WriteString(v.Format(time.RFC3339))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return buff.Bytes(), nil
|
return buff.Bytes(), nil
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ func TestMeta(t *testing.T) {
|
||||||
{"byte", "byteme", byte(67), "@byteme C", nil, "C"},
|
{"byte", "byteme", byte(67), "@byteme C", nil, "C"},
|
||||||
{"json-obj", "obj", json.RawMessage(`{"foo":"bar","baz":"quux"}`), `@obj {"foo":"bar","baz":"quux"}`, nil, json.RawMessage(`{"foo":"bar","baz":"quux"}`)},
|
{"json-obj", "obj", json.RawMessage(`{"foo":"bar","baz":"quux"}`), `@obj {"foo":"bar","baz":"quux"}`, nil, json.RawMessage(`{"foo":"bar","baz":"quux"}`)},
|
||||||
{"json-arr", "arr", json.RawMessage(`["foo",42,"bar", null,"quux", true]`), `@arr ["foo",42,"bar", null,"quux", true]`, nil, json.RawMessage(`["foo",42,"bar", null,"quux", true]`)},
|
{"json-arr", "arr", json.RawMessage(`["foo",42,"bar", null,"quux", true]`), `@arr ["foo",42,"bar", null,"quux", true]`, nil, json.RawMessage(`["foo",42,"bar", null,"quux", true]`)},
|
||||||
{"chan", "nope", make(chan bool), "", errors.New("Unknown type chan bool"), ""},
|
{"chan", "nope", make(chan bool), "", errors.New("Unsupported type chan bool"), ""},
|
||||||
{"whitespace-key", "no space", "hi", "", errors.New("whitespace is not allowed in key: no space"), ""},
|
{"whitespace-key", "no space", "hi", "", errors.New("whitespace is not allowed in key: no space"), ""},
|
||||||
{"empty-mar", "nope", skipMarshalTest, "", nil, ErrorParsing},
|
{"empty-mar", "nope", skipMarshalTest, "", nil, ErrorParsing},
|
||||||
{"no-key-mar", "nope", skipMarshalTest, "nope", nil, ErrorParsing},
|
{"no-key-mar", "nope", skipMarshalTest, "nope", nil, ErrorParsing},
|
||||||
|
|
|
||||||
44
tools/write_buffer.go
Normal file
44
tools/write_buffer.go
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
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
|
||||||
|
}
|
||||||
49
tools/write_buffer_test.go
Normal file
49
tools/write_buffer_test.go
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWriteBuffer(t *testing.T) {
|
||||||
|
when := time.Now()
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
value any
|
||||||
|
out string
|
||||||
|
err error
|
||||||
|
}{
|
||||||
|
{"nil", nil, "", nil},
|
||||||
|
{"string", "hi", "hi", nil},
|
||||||
|
{"bytes", []byte{104, 105}, "hi", nil},
|
||||||
|
{"byte", byte(104), "h", nil},
|
||||||
|
{"rune", 'h', "h", nil},
|
||||||
|
{"int", 42, "42", nil},
|
||||||
|
{"int64", int64(42), "42", nil},
|
||||||
|
{"float", 42.13, "42.13", nil},
|
||||||
|
{"bool", false, "false", nil},
|
||||||
|
{"json.Number", json.Number("42.13"), "42.13", nil},
|
||||||
|
{"json.RawMessage", json.RawMessage("{}"), "{}", nil},
|
||||||
|
{"time", when, when.Format(time.RFC3339), nil},
|
||||||
|
{"struct", struct{}{}, "", errors.New("Unsupported type struct {}")},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, getWriteTestRunner(tt.value, tt.out, tt.err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWriteTestRunner(value any, out string, err error) func(*testing.T) {
|
||||||
|
return func(t *testing.T) {
|
||||||
|
buff := &bytes.Buffer{}
|
||||||
|
n, er := WriteValue(buff, value)
|
||||||
|
assert.Equal(t, len(out), n)
|
||||||
|
assert.Equal(t, err, er)
|
||||||
|
assert.Equal(t, out, buff.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue