json.ErrorEmpty

master
Charles Iliya Krempeaux 2024-08-08 20:35:44 -07:00
parent fc545108d9
commit 506ae7916a
5 changed files with 69 additions and 12 deletions

9
errors.go 100644
View File

@ -0,0 +1,9 @@
package nul
import (
"github.com/reiver/go-erorr"
)
const (
errBadReflection = erorr.Error("opt: bad reflection")
)

9
go.mod
View File

@ -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
View File

@ -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=

View File

@ -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 {

View File

@ -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
}
} }
} }