json.ErrorEmpty
parent
fc545108d9
commit
506ae7916a
|
@ -0,0 +1,9 @@
|
||||||
|
package nul
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/reiver/go-erorr"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
errBadReflection = erorr.Error("opt: bad reflection")
|
||||||
|
)
|
9
go.mod
9
go.mod
|
@ -1,5 +1,10 @@
|
||||||
module github.com/reiver/go-nul
|
module github.com/reiver/go-nul
|
||||||
|
|
||||||
go 1.18
|
go 1.22.4
|
||||||
|
|
||||||
require github.com/reiver/go-erorr v0.0.0-20240704145350-0485e21eaa82
|
require (
|
||||||
|
github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f
|
||||||
|
github.com/reiver/go-json v0.0.0-20240808191545-fa5fbb1bb3f6
|
||||||
|
)
|
||||||
|
|
||||||
|
require github.com/reiver/go-lck v0.0.0-20240808133902-b56df221c39f // indirect
|
||||||
|
|
10
go.sum
10
go.sum
|
@ -1,2 +1,8 @@
|
||||||
github.com/reiver/go-erorr v0.0.0-20240704145350-0485e21eaa82 h1:xxt7qL+7ZfRysXWXU2MpULOg/zWe5P+Fmw9VyUFCmZE=
|
github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f h1:D1QSxKHm8U73XhjsW3SFLkT0zT5pKJi+1KGboMhY1Rk=
|
||||||
github.com/reiver/go-erorr v0.0.0-20240704145350-0485e21eaa82/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE=
|
github.com/reiver/go-erorr v0.0.0-20240801233437-8cbde6d1fa3f/go.mod h1:F0HbBf+Ak2ZlE8YkDW4Y+KxaUmT0KaaIJK6CXY3cJxE=
|
||||||
|
github.com/reiver/go-json v0.0.0-20240808191545-fa5fbb1bb3f6 h1:Ty3b38DeA5BKi42+3f3o8Bl4zEAKlJsF0ozArGJmo9k=
|
||||||
|
github.com/reiver/go-json v0.0.0-20240808191545-fa5fbb1bb3f6/go.mod h1:IHoQXCaObMGCDoTKko/XzDk8QbpNzepuCLMt7KKCLBs=
|
||||||
|
github.com/reiver/go-lck v0.0.0-20240808133902-b56df221c39f h1:KBVWBoNIM8mHkUR3dP64hm2p2vxoD5xHZ6wUllCjFTc=
|
||||||
|
github.com/reiver/go-lck v0.0.0-20240808133902-b56df221c39f/go.mod h1:PFseSi8S0CBkc+YB6jYWtogPk83LumclnYJZZBQJJhs=
|
||||||
|
github.com/reiver/go-opt v0.0.0-20240808175813-d4de6ca5ee95 h1:yMZeTlabM9bvx9ggghLCU4Djfp+FDcgC94+gyl+vzQE=
|
||||||
|
github.com/reiver/go-opt v0.0.0-20240808175813-d4de6ca5ee95/go.mod h1:iXlSKwDjhyF10Fdd2J5PYKwBFlWgfq7OTRxCHU+yTUY=
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package nul
|
package nul
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding"
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/reiver/go-erorr"
|
"github.com/reiver/go-erorr"
|
||||||
|
"github.com/reiver/go-json"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ json.Marshaler = Nothing[bool]()
|
var _ json.Marshaler = Nothing[bool]()
|
||||||
|
@ -13,16 +15,20 @@ var _ json.Marshaler = Nothing[string]()
|
||||||
// MarshalJSON makes it so json.Marshaler is implemented.
|
// MarshalJSON makes it so json.Marshaler is implemented.
|
||||||
func (receiver Nullable[T]) MarshalJSON() ([]byte, error) {
|
func (receiver Nullable[T]) MarshalJSON() ([]byte, error) {
|
||||||
switch interface{}(receiver.value).(type) {
|
switch interface{}(receiver.value).(type) {
|
||||||
case bool, string,json.Marshaler:
|
case json.Marshaler, encoding.TextMarshaler, bool, int, int8, int16, int32, int64, string, uint, uint8, uint16, uint32, uint64:
|
||||||
// these are OK.
|
// these are OK.
|
||||||
default:
|
default:
|
||||||
if reflect.Struct != reflect.TypeOf(receiver.value).Kind() {
|
var reflectedType reflect.Type = reflect.TypeOf(receiver.value)
|
||||||
return nil, erorr.Errorf("nul: cannot marshal something of type %T into JSON because parameterized type is ‘%T’ rather than ‘bool’, ‘string’, or ‘json.Marshaler’", receiver, receiver.value)
|
if nil == reflectedType {
|
||||||
|
return nil, errBadReflection
|
||||||
|
}
|
||||||
|
if reflect.Struct != reflectedType.Kind() {
|
||||||
|
return nil, erorr.Errorf("nul: cannot marshal something of type %T into JSON because parameterized type is ‘%T’ is not supported", receiver, receiver.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if receiver.isnothing() {
|
if receiver.isnothing() {
|
||||||
return nil, erorr.Errorf("nul: cannot marshal nul.Nothing[%T]() into JSON", receiver.value)
|
return nil, json.ErrEmpty(fmt.Sprintf("nul: cannot marshal nul.Nothing[%T]() into JSON", receiver.value))
|
||||||
}
|
}
|
||||||
|
|
||||||
if receiver.isnull {
|
if receiver.isnull {
|
||||||
|
|
|
@ -10,94 +10,125 @@ func TestNullable_MarshalJSON_int(t *testing.T) {
|
||||||
|
|
||||||
tests := []struct{
|
tests := []struct{
|
||||||
Value nul.Nullable[int]
|
Value nul.Nullable[int]
|
||||||
|
Expected string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
Value: nul.Null[int](),
|
Value: nul.Null[int](),
|
||||||
|
Expected: "null",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Value: nul.Something(-65536),
|
Value: nul.Something(-65536),
|
||||||
|
Expected: `-65536`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-65535),
|
Value: nul.Something(-65535),
|
||||||
|
Expected: `-65535`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Value: nul.Something(-256),
|
Value: nul.Something(-256),
|
||||||
|
Expected: `-256`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-255),
|
Value: nul.Something(-255),
|
||||||
|
Expected: `-255`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Value: nul.Something(-5),
|
Value: nul.Something(-5),
|
||||||
|
Expected: `-5`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-4),
|
Value: nul.Something(-4),
|
||||||
|
Expected: `-4`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-3),
|
Value: nul.Something(-3),
|
||||||
|
Expected: `-3`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-2),
|
Value: nul.Something(-2),
|
||||||
|
Expected: `-2`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(-1),
|
Value: nul.Something(-1),
|
||||||
|
Expected: `-1`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(0),
|
Value: nul.Something(0),
|
||||||
|
Expected: `0`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(1),
|
Value: nul.Something(1),
|
||||||
|
Expected: `1`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(2),
|
Value: nul.Something(2),
|
||||||
|
Expected: `2`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(3),
|
Value: nul.Something(3),
|
||||||
|
Expected: `3`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(4),
|
Value: nul.Something(4),
|
||||||
|
Expected: `4`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(5),
|
Value: nul.Something(5),
|
||||||
|
Expected: `5`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Value: nul.Something(255),
|
Value: nul.Something(255),
|
||||||
|
Expected: `255`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(256),
|
Value: nul.Something(256),
|
||||||
|
Expected: `256`,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Value: nul.Something(65535),
|
Value: nul.Something(65535),
|
||||||
|
Expected: `65535`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Value: nul.Something(65536),
|
Value: nul.Something(65536),
|
||||||
|
Expected: `65536`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for testNumber, test := range tests {
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
actualBytes, err := test.Value.MarshalJSON()
|
actualBytes, err := test.Value.MarshalJSON()
|
||||||
if nil == err {
|
if nil != err {
|
||||||
t.Errorf("For test #%d, expected an error but did not actually get one." , testNumber)
|
t.Errorf("For test #%d, did not expect an error but actually got one." , testNumber)
|
||||||
t.Logf("ACTUAL BYTES: %q", actualBytes)
|
|
||||||
t.Logf("ERROR: (%T) %s", err, err)
|
t.Logf("ERROR: (%T) %s", err, err)
|
||||||
t.Logf("VALUE: %#v", test.Value)
|
t.Logf("VALUE: %#v", test.Value)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
actual := string(actualBytes)
|
||||||
|
expected := test.Expected
|
||||||
|
|
||||||
|
if expected != actual {
|
||||||
|
t.Errorf("For test #%d, the actual value for the JSON marshaling is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
t.Logf("VALUE: %#v", test.Value)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue