mirror of
https://github.com/wneessen/niljson.git
synced 2024-11-22 05:30:49 +01:00
Winni Neessen
68fe249669
Corrected the spelling of the `Omitted` method to ensure consistency and avoid potential confusion. This change does not affect the functionality but improves code readability and accuracy.
106 lines
2.4 KiB
Go
106 lines
2.4 KiB
Go
// SPDX-FileCopyrightText: 2024 Winni Neessen <wn@neessen.dev>
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package niljson
|
|
|
|
import (
|
|
"encoding/json"
|
|
)
|
|
|
|
// NilBoolean is an boolean type that can be nil
|
|
type NilBoolean = Variable[bool]
|
|
|
|
// NilByteSlice is a []byte type that can be nil
|
|
type NilByteSlice = Variable[[]byte]
|
|
|
|
// NilInt is an int type that can be nil
|
|
type NilInt = Variable[int]
|
|
|
|
// NilInt64 is an int64 type that can be nil
|
|
type NilInt64 = Variable[int64]
|
|
|
|
// NilUInt is an uint type that can be nil
|
|
type NilUInt = Variable[uint]
|
|
|
|
// NilUInt8 is an uint8 type that can be nil
|
|
type NilUInt8 = Variable[uint8]
|
|
|
|
// NilUInt16 is an uint16 type that can be nil
|
|
type NilUInt16 = Variable[uint16]
|
|
|
|
// NilUInt32 is an uint32 type that can be nil
|
|
type NilUInt32 = Variable[uint32]
|
|
|
|
// NilUInt64 is an uint64 type that can be nil
|
|
type NilUInt64 = Variable[uint64]
|
|
|
|
// NilFloat32 is an float32 type that can be nil
|
|
type NilFloat32 = Variable[float32]
|
|
|
|
// NilFloat64 is an float64 type that can be nil
|
|
type NilFloat64 = Variable[float64]
|
|
|
|
// NilString is a string type that can be nil
|
|
type NilString = Variable[string]
|
|
|
|
// Variable is a generic variable type that can be null.
|
|
type Variable[T any] struct {
|
|
value T
|
|
notNil bool
|
|
present bool
|
|
}
|
|
|
|
// NewVariable returns a new Variable of generic type
|
|
func NewVariable[T any](value T) Variable[T] {
|
|
return Variable[T]{
|
|
notNil: true,
|
|
value: value,
|
|
}
|
|
}
|
|
|
|
// IsNil returns true when a Variable is nil
|
|
func (v *Variable[T]) IsNil() bool {
|
|
return !v.notNil
|
|
}
|
|
|
|
// NotNil returns true when a Variable is not nil
|
|
func (v *Variable[T]) NotNil() bool {
|
|
return v.notNil
|
|
}
|
|
|
|
// Omitted returns true if a value was omitted in the JSON
|
|
func (v *Variable[T]) Omitted() bool {
|
|
return !v.present
|
|
}
|
|
|
|
// Reset resets the value to the Variable to a zero value and sets it to be nil
|
|
func (v *Variable[T]) Reset() {
|
|
var newVal T
|
|
v.value = newVal
|
|
v.notNil = false
|
|
}
|
|
|
|
// Value returns the value of the Variable
|
|
func (v *Variable[T]) Value() T {
|
|
return v.value
|
|
}
|
|
|
|
// MarshalJSON satisfies the json.Marshaler interface for generic Variable types
|
|
func (v *Variable[T]) MarshalJSON() ([]byte, error) {
|
|
if !v.notNil {
|
|
return json.Marshal(nil)
|
|
}
|
|
return json.Marshal(v.value)
|
|
}
|
|
|
|
// UnmarshalJSON satisfies the json.Unmarshaler interface for generic Variable types
|
|
func (v *Variable[T]) UnmarshalJSON(data []byte) error {
|
|
v.present = true
|
|
if string(data) != "null" {
|
|
v.value = *new(T)
|
|
v.notNil = true
|
|
return json.Unmarshal(data, &v.value)
|
|
}
|
|
return nil
|
|
}
|