Skip to content

Commit e28ae8d

Browse files
committed
feat: implement TextMarshaler and TextUnmarshaler for IntOrString
Implement text marshaling for IntOrString. This allows IntOrString to be used as map keys when marshaling to/form JSON. Signed-off-by: setrofim <setrofim@gmail.com>
1 parent f8bbe79 commit e28ae8d

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

‎int_or_string.go‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,12 @@ func (o *IntOrString) UnmarshalJSON(data []byte) error {
171171

172172
return nil
173173
}
174+
175+
func (o IntOrString) MarshalText() ([]byte, error) {
176+
return []byte(o.String()), nil
177+
}
178+
179+
func (o *IntOrString) UnmarshalText(data []byte) error {
180+
*o = IntOrStringFromString(string(data))
181+
return nil
182+
}

‎int_or_string_test.go‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package eat
55

66
import (
7+
"encoding/json"
78
"testing"
89

910
"github.com/stretchr/testify/assert"
@@ -171,3 +172,19 @@ func TestIntOrString_misc(t *testing.T) {
171172
ios = IntOrStringFromString("1")
172173
assert.Equal(t, 1, ios.Int())
173174
}
175+
176+
func TestIntOrString_JSON_key(t *testing.T) {
177+
toEncode := map[IntOrString]any{
178+
IntOrStringFromString("foo"): 1,
179+
}
180+
181+
expectedJSON := `{"foo": 1}`
182+
encoded, err := json.Marshal(toEncode)
183+
assert.NoError(t, err)
184+
assert.JSONEq(t, expectedJSON, string(encoded))
185+
186+
var decoded map[IntOrString]any
187+
err = json.Unmarshal(encoded, &decoded)
188+
assert.NoError(t, err)
189+
assert.EqualValues(t, 1, int(decoded[IntOrStringFromString("foo")].(float64)))
190+
}

0 commit comments

Comments
 (0)