summaryrefslogtreecommitdiffhomepage
path: root/tailcfg
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2025-08-14 13:46:48 -0700
committerGitHub <noreply@github.com>2025-08-14 13:46:48 -0700
commitfbb91758ac41d279bf67103d204690ba8520afa2 (patch)
tree9c31d14291059638b855166dcad4116e97731af9 /tailcfg
parentc083a9b05330372aa0435f4c89fb1784c826f9bb (diff)
downloadtailscale-fbb91758ac41d279bf67103d204690ba8520afa2.tar.xz
tailscale-fbb91758ac41d279bf67103d204690ba8520afa2.zip
cmd/viewer, types/views: implement support for json/v2 (#16852)
This adds support for having every viewer type implement jsonv2.MarshalerTo and jsonv2.UnmarshalerFrom. This provides a significant boost in performance as the json package no longer needs to validate the entirety of the JSON value outputted by MarshalJSON, nor does it need to identify the boundaries of a JSON value in order to call UnmarshalJSON. For deeply nested and recursive MarshalJSON or UnmarshalJSON calls, this can improve runtime from O(N²) to O(N). This still references "github.com/go-json-experiment/json" instead of the experimental "encoding/json/v2" package now available in Go 1.25 under goexperiment.jsonv2 so that code still builds without the experiment tag. Of note, the "github.com/go-json-experiment/json" package aliases the standard library under the right build conditions. Updates tailscale/corp#791 Signed-off-by: Joe Tsai <joetsai@digital-static.net>
Diffstat (limited to 'tailcfg')
-rw-r--r--tailcfg/tailcfg_view.go524
1 files changed, 483 insertions, 41 deletions
diff --git a/tailcfg/tailcfg_view.go b/tailcfg/tailcfg_view.go
index c40780021..8dc4f1ca8 100644
--- a/tailcfg/tailcfg_view.go
+++ b/tailcfg/tailcfg_view.go
@@ -6,11 +6,13 @@
package tailcfg
import (
- "encoding/json"
+ jsonv1 "encoding/json"
"errors"
"net/netip"
"time"
+ jsonv2 "github.com/go-json-experiment/json"
+ "github.com/go-json-experiment/json/jsontext"
"tailscale.com/types/dnstype"
"tailscale.com/types/key"
"tailscale.com/types/opt"
@@ -49,8 +51,17 @@ func (v UserView) AsStruct() *User {
return v.ж.Clone()
}
-func (v UserView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v UserView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v UserView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *UserView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -59,7 +70,20 @@ func (v *UserView) UnmarshalJSON(b []byte) error {
return nil
}
var x User
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *UserView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x User
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -107,8 +131,17 @@ func (v NodeView) AsStruct() *Node {
return v.ж.Clone()
}
-func (v NodeView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v NodeView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v NodeView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *NodeView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -117,7 +150,20 @@ func (v *NodeView) UnmarshalJSON(b []byte) error {
return nil
}
var x Node
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *NodeView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x Node
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -246,8 +292,17 @@ func (v HostinfoView) AsStruct() *Hostinfo {
return v.ж.Clone()
}
-func (v HostinfoView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v HostinfoView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v HostinfoView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *HostinfoView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -256,7 +311,20 @@ func (v *HostinfoView) UnmarshalJSON(b []byte) error {
return nil
}
var x Hostinfo
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *HostinfoView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x Hostinfo
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -380,8 +448,17 @@ func (v NetInfoView) AsStruct() *NetInfo {
return v.ж.Clone()
}
-func (v NetInfoView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v NetInfoView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v NetInfoView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *NetInfoView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -390,7 +467,20 @@ func (v *NetInfoView) UnmarshalJSON(b []byte) error {
return nil
}
var x NetInfo
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *NetInfoView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x NetInfo
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -460,8 +550,17 @@ func (v LoginView) AsStruct() *Login {
return v.ж.Clone()
}
-func (v LoginView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v LoginView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v LoginView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *LoginView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -470,7 +569,20 @@ func (v *LoginView) UnmarshalJSON(b []byte) error {
return nil
}
var x Login
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *LoginView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x Login
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -521,8 +633,17 @@ func (v DNSConfigView) AsStruct() *DNSConfig {
return v.ж.Clone()
}
-func (v DNSConfigView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v DNSConfigView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v DNSConfigView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *DNSConfigView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -531,7 +652,20 @@ func (v *DNSConfigView) UnmarshalJSON(b []byte) error {
return nil
}
var x DNSConfig
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *DNSConfigView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x DNSConfig
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -602,8 +736,17 @@ func (v RegisterResponseView) AsStruct() *RegisterResponse {
return v.ж.Clone()
}
-func (v RegisterResponseView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v RegisterResponseView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v RegisterResponseView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *RegisterResponseView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -612,7 +755,20 @@ func (v *RegisterResponseView) UnmarshalJSON(b []byte) error {
return nil
}
var x RegisterResponse
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *RegisterResponseView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x RegisterResponse
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -668,8 +824,17 @@ func (v RegisterResponseAuthView) AsStruct() *RegisterResponseAuth {
return v.ж.Clone()
}
-func (v RegisterResponseAuthView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v RegisterResponseAuthView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v RegisterResponseAuthView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *RegisterResponseAuthView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -678,7 +843,20 @@ func (v *RegisterResponseAuthView) UnmarshalJSON(b []byte) error {
return nil
}
var x RegisterResponseAuth
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *RegisterResponseAuthView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x RegisterResponseAuth
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -726,8 +904,17 @@ func (v RegisterRequestView) AsStruct() *RegisterRequest {
return v.ж.Clone()
}
-func (v RegisterRequestView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v RegisterRequestView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v RegisterRequestView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *RegisterRequestView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -736,7 +923,20 @@ func (v *RegisterRequestView) UnmarshalJSON(b []byte) error {
return nil
}
var x RegisterRequest
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *RegisterRequestView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x RegisterRequest
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -816,8 +1016,17 @@ func (v DERPHomeParamsView) AsStruct() *DERPHomeParams {
return v.ж.Clone()
}
-func (v DERPHomeParamsView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v DERPHomeParamsView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v DERPHomeParamsView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *DERPHomeParamsView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -826,7 +1035,20 @@ func (v *DERPHomeParamsView) UnmarshalJSON(b []byte) error {
return nil
}
var x DERPHomeParams
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *DERPHomeParamsView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x DERPHomeParams
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -870,8 +1092,17 @@ func (v DERPRegionView) AsStruct() *DERPRegion {
return v.ж.Clone()
}
-func (v DERPRegionView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v DERPRegionView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v DERPRegionView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *DERPRegionView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -880,7 +1111,20 @@ func (v *DERPRegionView) UnmarshalJSON(b []byte) error {
return nil
}
var x DERPRegion
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *DERPRegionView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x DERPRegion
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -938,8 +1182,17 @@ func (v DERPMapView) AsStruct() *DERPMap {
return v.ж.Clone()
}
-func (v DERPMapView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v DERPMapView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v DERPMapView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *DERPMapView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -948,7 +1201,20 @@ func (v *DERPMapView) UnmarshalJSON(b []byte) error {
return nil
}
var x DERPMap
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *DERPMapView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x DERPMap
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -999,8 +1265,17 @@ func (v DERPNodeView) AsStruct() *DERPNode {
return v.ж.Clone()
}
-func (v DERPNodeView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v DERPNodeView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v DERPNodeView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *DERPNodeView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1009,7 +1284,20 @@ func (v *DERPNodeView) UnmarshalJSON(b []byte) error {
return nil
}
var x DERPNode
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *DERPNodeView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x DERPNode
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1073,8 +1361,17 @@ func (v SSHRuleView) AsStruct() *SSHRule {
return v.ж.Clone()
}
-func (v SSHRuleView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v SSHRuleView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v SSHRuleView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *SSHRuleView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1083,7 +1380,20 @@ func (v *SSHRuleView) UnmarshalJSON(b []byte) error {
return nil
}
var x SSHRule
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *SSHRuleView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x SSHRule
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1139,8 +1449,17 @@ func (v SSHActionView) AsStruct() *SSHAction {
return v.ж.Clone()
}
-func (v SSHActionView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v SSHActionView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v SSHActionView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *SSHActionView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1149,7 +1468,20 @@ func (v *SSHActionView) UnmarshalJSON(b []byte) error {
return nil
}
var x SSHAction
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *SSHActionView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x SSHAction
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1211,8 +1543,17 @@ func (v SSHPrincipalView) AsStruct() *SSHPrincipal {
return v.ж.Clone()
}
-func (v SSHPrincipalView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v SSHPrincipalView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v SSHPrincipalView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *SSHPrincipalView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1221,7 +1562,20 @@ func (v *SSHPrincipalView) UnmarshalJSON(b []byte) error {
return nil
}
var x SSHPrincipal
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *SSHPrincipalView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x SSHPrincipal
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1273,8 +1627,17 @@ func (v ControlDialPlanView) AsStruct() *ControlDialPlan {
return v.ж.Clone()
}
-func (v ControlDialPlanView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v ControlDialPlanView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v ControlDialPlanView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *ControlDialPlanView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1283,7 +1646,20 @@ func (v *ControlDialPlanView) UnmarshalJSON(b []byte) error {
return nil
}
var x ControlDialPlan
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *ControlDialPlanView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x ControlDialPlan
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1327,8 +1703,17 @@ func (v LocationView) AsStruct() *Location {
return v.ж.Clone()
}
-func (v LocationView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v LocationView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v LocationView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *LocationView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1337,7 +1722,20 @@ func (v *LocationView) UnmarshalJSON(b []byte) error {
return nil
}
var x Location
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *LocationView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x Location
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1391,8 +1789,17 @@ func (v UserProfileView) AsStruct() *UserProfile {
return v.ж.Clone()
}
-func (v UserProfileView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v UserProfileView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v UserProfileView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *UserProfileView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1401,7 +1808,20 @@ func (v *UserProfileView) UnmarshalJSON(b []byte) error {
return nil
}
var x UserProfile
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *UserProfileView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x UserProfile
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x
@@ -1450,8 +1870,17 @@ func (v VIPServiceView) AsStruct() *VIPService {
return v.ж.Clone()
}
-func (v VIPServiceView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
+// MarshalJSON implements [jsonv1.Marshaler].
+func (v VIPServiceView) MarshalJSON() ([]byte, error) {
+ return jsonv1.Marshal(v.ж)
+}
+
+// MarshalJSONTo implements [jsonv2.MarshalerTo].
+func (v VIPServiceView) MarshalJSONTo(enc *jsontext.Encoder) error {
+ return jsonv2.MarshalEncode(enc, v.ж)
+}
+// UnmarshalJSON implements [jsonv1.Unmarshaler].
func (v *VIPServiceView) UnmarshalJSON(b []byte) error {
if v.ж != nil {
return errors.New("already initialized")
@@ -1460,7 +1889,20 @@ func (v *VIPServiceView) UnmarshalJSON(b []byte) error {
return nil
}
var x VIPService
- if err := json.Unmarshal(b, &x); err != nil {
+ if err := jsonv1.Unmarshal(b, &x); err != nil {
+ return err
+ }
+ v.ж = &x
+ return nil
+}
+
+// UnmarshalJSONFrom implements [jsonv2.UnmarshalerFrom].
+func (v *VIPServiceView) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
+ if v.ж != nil {
+ return errors.New("already initialized")
+ }
+ var x VIPService
+ if err := jsonv2.UnmarshalDecode(dec, &x); err != nil {
return err
}
v.ж = &x