From 7b2c24753868afb958c606ead2056344c78c7481 Mon Sep 17 00:00:00 2001 From: Levente Batuska Date: Sat, 4 Jan 2025 02:37:20 +0100 Subject: [PATCH] feat(Type): add driver.Valuer implementation to Optional type --- type/interfaces.go | 5 ++++- type/optional.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/type/interfaces.go b/type/interfaces.go index cc71cc8..fe94a30 100644 --- a/type/interfaces.go +++ b/type/interfaces.go @@ -2,6 +2,7 @@ package Type import ( "database/sql" + "database/sql/driver" "encoding/json" ) @@ -50,7 +51,9 @@ var ( _ ValueContainer = (*Result[any])(nil) _ sql.Scanner = (*Optional[any])(nil) _ sql.Scanner = (*Result[any])(nil) - _ json.Marshaler = (*Optional[any])(nil) + _ driver.Valuer = (*Optional[any])(nil) + // _ driver.Valuer = (*Result[any])(nil) + _ json.Marshaler = (*Optional[any])(nil) // _ json.Marshaler = (*Result[any])(nil) _ json.Unmarshaler = (*Optional[any])(nil) // _ json.Unmarshaler = (*Result[any])(nil) diff --git a/type/optional.go b/type/optional.go index ac2cf77..c1aef5a 100644 --- a/type/optional.go +++ b/type/optional.go @@ -2,7 +2,9 @@ package Type import ( "database/sql" + "database/sql/driver" "encoding/json" + "errors" "fmt" "reflect" "time" @@ -285,3 +287,34 @@ func (opt *Optional[T]) UnmarshalJSON(data []byte) error { opt.present = true return nil } + +func (o Optional[T]) Value() (driver.Value, error) { + if !o.present { + return nil, nil + } + + switch v := any(o.Value).(type) { + + case string, bool, + int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, uintptr, + float32, float64, + complex64, complex128: + return v, nil + + case *string, *bool, + *int, *int8, *int16, *int32, *int64, + *uint, *uint8, *uint16, *uint32, *uint64, *uintptr, + *float32, *float64, + *complex64, *complex128: + return v, nil + + case fmt.Stringer: + return v.String(), nil + case driver.Valuer: + return v.Value() + + default: + return nil, errors.New("unsupported type for Optional") + } +}