null

package
v0.0.0-...-083f18a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 23, 2024 License: MIT Imports: 7 Imported by: 9

Documentation

Overview

Package null exposes a Val(ue) type that wraps a regular value with the ability to be 'null'.

Index

Constants

View Source
const (
	StateNull state = 0
	StateSet  state = 1
)

Variables

This section is empty.

Functions

func Equal

func Equal[T comparable](a, b Val[T]) bool

Equal compares two nullable values and returns true if they are equal.

Types

type Val

type Val[T any] struct {
	// contains filtered or unexported fields
}

Val allows representing a value with a state of "null" or "set". Its zero value is usfel and initially "null".

func From

func From[T any](val T) Val[T]

From a value which is considered 'set'

func FromCond

func FromCond[T any](val T, ok bool) Val[T]

FromCond conditionally creates a 'set' value if the bool is true, else it will return a null value.

func FromPtr

func FromPtr[T any](val *T) Val[T]

FromPtr creates a value from a pointer, if the pointer is null it will be 'null', if it has a value the deferenced value is stored.

func Map

func Map[A any, B any](v Val[A], fn func(A) B) Val[B]

Map transforms the value inside if it is set, else it returns a value of the same state.

func (Val[T]) Get

func (v Val[T]) Get() (T, bool)

Get the underlying value, if one exists.

func (Val[T]) GetOr

func (v Val[T]) GetOr(fallback T) T

GetOr gets the value or returns a fallback if the value does not exist.

func (Val[T]) GetOrZero

func (v Val[T]) GetOrZero() T

GetOrZero returns the zero value for T if the value was omitted.

func (Val[T]) IsNull

func (v Val[T]) IsNull() bool

IsNull returns true if v contains a null value

func (Val[T]) IsSet

func (v Val[T]) IsSet() bool

IsSet returns true if v contains a non-null value

func (Val[T]) Map

func (v Val[T]) Map(fn func(T) T) Val[T]

Map transforms the value inside if it is set, else it returns a value of the same state.

Until a later Go version adds type parameters to methods, it is not possible to map to a different type. See the non-method function Map if you need another type.

func (Val[T]) MarshalBinary

func (v Val[T]) MarshalBinary() ([]byte, error)

MarshalBinary tries to encode the value in binary. If it finds type that implements encoding.BinaryMarshaler it will use that, it will fallback to encoding.TextMarshaler if that is implemented, and failing that it will attempt to do some reflect to convert between the types to hit common cases like Go primitives.

func (Val[T]) MarshalJSON

func (v Val[T]) MarshalJSON() ([]byte, error)

MarshalJSON implements json.Marshaler.

func (Val[T]) MarshalText

func (v Val[T]) MarshalText() ([]byte, error)

MarshalText implements encoding.TextMarshaler.

This package emits an empty string for null values as its way of compactly storing the state. This probably isn't canonically useful but it's hard to agree on a better way because various implementations of serialization may use a different representation of null (such as nil).

Further to that it would prevent us from just encoding the string "null" since null.From("null") would be both valid and useful.

It may in the future be more useful to rely on a []byte("null") as a sentinel value, but for now this package will assume that any value being consumed by null.UnmarshalText() has been created with null.MarshalText() and it therefore strives to make no gesture of compatibility with non-null.Val serialized types.

func (Val[T]) MustGet

func (v Val[T]) MustGet() T

MustGet retrieves the value or panics if it's null

func (*Val[T]) Null

func (v *Val[T]) Null()

Null sets the value to null (state is set to 'null')

func (Val[T]) Or

func (v Val[T]) Or(other Val[T]) Val[T]

Or returns v or other depending on their states. In general set > null > unset and therefore the one with the state highest in that area will win out.

v     | other | result
------------- | -------
set   | _     | v
null  | set   | other
null  | null  | v

func (Val[T]) Ptr

func (v Val[T]) Ptr() *T

Ptr returns a pointer to the value, or nil if null.

func (*Val[T]) Scan

func (v *Val[T]) Scan(value any) error

Scan implements the sql.Scanner interface. If the wrapped type implements sql.Scanner then it will call that.

func (*Val[T]) Set

func (v *Val[T]) Set(val T)

Set the value (and the state to 'set')

func (*Val[T]) SetPtr

func (v *Val[T]) SetPtr(val *T)

SetPtr sets the value to (value, set) if val is non-nil or (??, null) if not. The value is dereferenced before stored.

func (Val[T]) State

func (v Val[T]) State() state

State retrieves the internal state, mostly useful for testing.

func (*Val[T]) UnmarshalBinary

func (v *Val[T]) UnmarshalBinary(b []byte) error

UnmarshalBinary tries to reverse the value MarshalBinary operation. See documentation there for details about supported types.

func (*Val[T]) UnmarshalJSON

func (v *Val[T]) UnmarshalJSON(data []byte) error

UnmarshalJSON implements json.Unmarshaler

func (*Val[T]) UnmarshalText

func (v *Val[T]) UnmarshalText(text []byte) error

UnmarshalText implements encoding.TextUnmarshaler.

It specifically does not understand the word "null" to mean anything special, as that would preclude us from encoding the string "null" as a non-null string value.

func (Val[T]) Value

func (v Val[T]) Value() (driver.Value, error)

Value implements the driver.Valuer interface. If the underlying type implements the driver.Valuer it will call that (when not null). Go primitive types will be converted where possible.

int64
float64
bool
[]byte
string
time.Time

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL