AdGuardHome/internal/next/jsonpatch/jsonpatch.go

44 lines
930 B
Go
Raw Normal View History

// Package jsonpatch contains utilities for JSON Merge Patch APIs.
//
// See https://www.rfc-editor.org/rfc/rfc7396.
package jsonpatch
import (
"bytes"
"encoding/json"
"github.com/AdguardTeam/golibs/errors"
)
// NonRemovable is a type that prevents JSON null from being used to try and
// remove a value.
type NonRemovable[T any] struct {
Value T
IsSet bool
}
// type check
var _ json.Unmarshaler = (*NonRemovable[struct{}])(nil)
// UnmarshalJSON implements the [json.Unmarshaler] interface for *NonRemovable.
func (v *NonRemovable[T]) UnmarshalJSON(b []byte) (err error) {
if v == nil {
return errors.Error("jsonpatch.NonRemovable is nil")
}
if bytes.Equal(b, []byte("null")) {
return errors.Error("property cannot be removed")
}
v.IsSet = true
return json.Unmarshal(b, &v.Value)
}
// Set sets ptr if the value has been provided.
func (v NonRemovable[T]) Set(ptr *T) {
if v.IsSet {
*ptr = v.Value
}
}