mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-25 08:08:18 +03:00
d3cc2dc930
Merge in DNS/adguard-home from websvc-patch to master Squashed commit of the following: commit b2a10faf12b16f13f617b3ed3ef3e81cb0479ff8 Merge:38f749106
8f53f6505
Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Wed Dec 11 17:33:15 2024 +0300 Merge branch 'master' into websvc-patch commit38f7491069
Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Dec 10 19:57:54 2024 +0300 next: add json merge patch utils
43 lines
930 B
Go
43 lines
930 B
Go
// 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
|
|
}
|
|
}
|