diff --git a/tailcfg/tailcfg.go b/tailcfg/tailcfg.go index c4ee1bcc8..b313a5ca9 100644 --- a/tailcfg/tailcfg.go +++ b/tailcfg/tailcfg.go @@ -4,7 +4,7 @@ package tailcfg -//go:generate go run tailscale.com/cmd/cloner --type=User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse,DERPRegion,DERPMap,DERPNode --clonefunc +//go:generate go run tailscale.com/cmd/viewer --type=User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse,DERPRegion,DERPMap,DERPNode --clonefunc import ( "encoding/hex" @@ -531,6 +531,13 @@ type NetInfo struct { // Update BasicallyEqual when adding fields. } +// DERPLatencyForEach calls fn for each value in the DERPLatency map. +func (v NetInfoView) DERPLatencyForEach(fn func(k string, v float64)) { + for k, v := range v.ж.DERPLatency { + fn(k, v) + } +} + func (ni *NetInfo) String() string { if ni == nil { return "NetInfo(nil)" diff --git a/tailcfg/tailcfg_clone.go b/tailcfg/tailcfg_clone.go index 047705bfe..df313cb5a 100644 --- a/tailcfg/tailcfg_clone.go +++ b/tailcfg/tailcfg_clone.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Code generated by tailscale.com/util/codegen (cloner); DO NOT EDIT. +// Code generated by tailscale.com/cmd/cloner; DO NOT EDIT. package tailcfg diff --git a/tailcfg/tailcfg_view.go b/tailcfg/tailcfg_view.go index 35fc8cf58..a5f95457b 100644 --- a/tailcfg/tailcfg_view.go +++ b/tailcfg/tailcfg_view.go @@ -2,99 +2,336 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Code generated by tailscale/cmd/viewer; DO NOT EDIT. + package tailcfg import ( "encoding/json" "errors" + "time" + "inet.af/netaddr" + "tailscale.com/types/dnstype" + "tailscale.com/types/key" "tailscale.com/types/opt" + "tailscale.com/types/structs" "tailscale.com/types/views" ) -// View returns a read-only accessor for hi. -func (hi *Hostinfo) View() HostinfoView { return HostinfoView{hi} } +//go:generate go run tailscale.com/cmd/cloner -clonefunc=true -type=User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse,DERPRegion,DERPMap,DERPNode -// HostinfoView is a read-only accessor for Hostinfo. -// See Hostinfo. -type HostinfoView struct { +// View returns a readonly view of User. +func (p *User) View() UserView { + return UserView{ж: p} +} + +// UserView provides a read-only view over User. +// +// Its methods should only be called if `Valid()` returns true. +type UserView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. // It is named distinctively to make you think of how dangerous it is to escape // to callers. You must not let callers be able to mutate it. - ж *Hostinfo + ж *User } -func (v HostinfoView) MarshalJSON() ([]byte, error) { - return json.Marshal(v.ж) +// Valid reports whether underlying value is non-nil. +func (v UserView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v UserView) AsStruct() *User { + if v.ж == nil { + return nil + } + return v.ж.Clone() } -func (v *HostinfoView) UnmarshalJSON(b []byte) error { +func (v UserView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *UserView) UnmarshalJSON(b []byte) error { if v.ж != nil { - return errors.New("HostinfoView is already initialized") + return errors.New("already initialized") } if len(b) == 0 { return nil } - hi := &Hostinfo{} - if err := json.Unmarshal(b, hi); err != nil { + var x User + if err := json.Unmarshal(b, &x); err != nil { return err } - v.ж = hi + v.ж = &x return nil } -// Valid reports whether the underlying value is not nil. -func (v HostinfoView) Valid() bool { return v.ж != nil } +func (v UserView) ID() UserID { return v.ж.ID } +func (v UserView) LoginName() string { return v.ж.LoginName } +func (v UserView) DisplayName() string { return v.ж.DisplayName } +func (v UserView) ProfilePicURL() string { return v.ж.ProfilePicURL } +func (v UserView) Domain() string { return v.ж.Domain } +func (v UserView) Logins() views.Slice[LoginID] { return views.SliceOf(v.ж.Logins) } +func (v UserView) Created() time.Time { return v.ж.Created } -// AsStruct returns a deep-copy of the underlying value. -func (v HostinfoView) AsStruct() *Hostinfo { return v.ж.Clone() } - -func (v HostinfoView) IPNVersion() string { return v.ж.IPNVersion } -func (v HostinfoView) FrontendLogID() string { return v.ж.FrontendLogID } -func (v HostinfoView) BackendLogID() string { return v.ж.BackendLogID } -func (v HostinfoView) OS() string { return v.ж.OS } -func (v HostinfoView) OSVersion() string { return v.ж.OSVersion } -func (v HostinfoView) Package() string { return v.ж.Package } -func (v HostinfoView) DeviceModel() string { return v.ж.DeviceModel } -func (v HostinfoView) Hostname() string { return v.ж.Hostname } -func (v HostinfoView) ShieldsUp() bool { return v.ж.ShieldsUp } -func (v HostinfoView) ShareeNode() bool { return v.ж.ShareeNode } -func (v HostinfoView) GoArch() string { return v.ж.GoArch } -func (v HostinfoView) Equal(v2 HostinfoView) bool { return v.ж.Equal(v2.ж) } +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _UserViewNeedsRegeneration = User(struct { + ID UserID + LoginName string + DisplayName string + ProfilePicURL string + Domain string + Logins []LoginID + Created time.Time +}{}) -func (v HostinfoView) RoutableIPs() views.IPPrefixSlice { - return views.IPPrefixSliceOf(v.ж.RoutableIPs) +// View returns a readonly view of Node. +func (p *Node) View() NodeView { + return NodeView{ж: p} +} + +// NodeView provides a read-only view over Node. +// +// Its methods should only be called if `Valid()` returns true. +type NodeView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *Node +} + +// Valid reports whether underlying value is non-nil. +func (v NodeView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v NodeView) AsStruct() *Node { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v NodeView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *NodeView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x Node + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil } -func (v HostinfoView) RequestTags() views.Slice[string] { - return views.SliceOf(v.ж.RequestTags) +func (v NodeView) ID() NodeID { return v.ж.ID } +func (v NodeView) StableID() StableNodeID { return v.ж.StableID } +func (v NodeView) Name() string { return v.ж.Name } +func (v NodeView) User() UserID { return v.ж.User } +func (v NodeView) Sharer() UserID { return v.ж.Sharer } +func (v NodeView) Key() key.NodePublic { return v.ж.Key } +func (v NodeView) KeyExpiry() time.Time { return v.ж.KeyExpiry } +func (v NodeView) Machine() key.MachinePublic { return v.ж.Machine } +func (v NodeView) DiscoKey() key.DiscoPublic { return v.ж.DiscoKey } +func (v NodeView) Addresses() views.IPPrefixSlice { return views.IPPrefixSliceOf(v.ж.Addresses) } +func (v NodeView) AllowedIPs() views.IPPrefixSlice { return views.IPPrefixSliceOf(v.ж.AllowedIPs) } +func (v NodeView) Endpoints() views.Slice[string] { return views.SliceOf(v.ж.Endpoints) } +func (v NodeView) DERP() string { return v.ж.DERP } +func (v NodeView) Hostinfo() HostinfoView { return v.ж.Hostinfo } +func (v NodeView) Created() time.Time { return v.ж.Created } +func (v NodeView) Tags() views.Slice[string] { return views.SliceOf(v.ж.Tags) } +func (v NodeView) PrimaryRoutes() views.IPPrefixSlice { + return views.IPPrefixSliceOf(v.ж.PrimaryRoutes) +} +func (v NodeView) LastSeen() *time.Time { + if v.ж.LastSeen == nil { + return nil + } + x := *v.ж.LastSeen + return &x } -func (v HostinfoView) SSH_HostKeys() views.Slice[string] { - return views.SliceOf(v.ж.SSH_HostKeys) +func (v NodeView) Online() *bool { + if v.ж.Online == nil { + return nil + } + x := *v.ж.Online + return &x } -func (v HostinfoView) Services() views.Slice[Service] { - return views.SliceOf(v.ж.Services) +func (v NodeView) KeepAlive() bool { return v.ж.KeepAlive } +func (v NodeView) MachineAuthorized() bool { return v.ж.MachineAuthorized } +func (v NodeView) Capabilities() views.Slice[string] { return views.SliceOf(v.ж.Capabilities) } +func (v NodeView) ComputedName() string { return v.ж.ComputedName } +func (v NodeView) ComputedNameWithHost() string { return v.ж.ComputedNameWithHost } +func (v NodeView) Equal(v2 NodeView) bool { return v.ж.Equal(v2.ж) } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _NodeViewNeedsRegeneration = Node(struct { + ID NodeID + StableID StableNodeID + Name string + User UserID + Sharer UserID + Key key.NodePublic + KeyExpiry time.Time + Machine key.MachinePublic + DiscoKey key.DiscoPublic + Addresses []netaddr.IPPrefix + AllowedIPs []netaddr.IPPrefix + Endpoints []string + DERP string + Hostinfo HostinfoView + Created time.Time + Tags []string + PrimaryRoutes []netaddr.IPPrefix + LastSeen *time.Time + Online *bool + KeepAlive bool + MachineAuthorized bool + Capabilities []string + ComputedName string + computedHostIfDifferent string + ComputedNameWithHost string +}{}) + +// View returns a readonly view of Hostinfo. +func (p *Hostinfo) View() HostinfoView { + return HostinfoView{ж: p} } -func (v HostinfoView) NetInfo() NetInfoView { return v.ж.NetInfo.View() } +// HostinfoView provides a read-only view over Hostinfo. +// +// Its methods should only be called if `Valid()` returns true. +type HostinfoView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *Hostinfo +} + +// Valid reports whether underlying value is non-nil. +func (v HostinfoView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v HostinfoView) AsStruct() *Hostinfo { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} -// View returns a read-only accessor for ni. -func (ni *NetInfo) View() NetInfoView { return NetInfoView{ni} } +func (v HostinfoView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } -// NetInfoView is a read-only accessor for NetInfo. -// See NetInfo. +func (v *HostinfoView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x Hostinfo + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v HostinfoView) IPNVersion() string { return v.ж.IPNVersion } +func (v HostinfoView) FrontendLogID() string { return v.ж.FrontendLogID } +func (v HostinfoView) BackendLogID() string { return v.ж.BackendLogID } +func (v HostinfoView) OS() string { return v.ж.OS } +func (v HostinfoView) OSVersion() string { return v.ж.OSVersion } +func (v HostinfoView) Desktop() opt.Bool { return v.ж.Desktop } +func (v HostinfoView) Package() string { return v.ж.Package } +func (v HostinfoView) DeviceModel() string { return v.ж.DeviceModel } +func (v HostinfoView) Hostname() string { return v.ж.Hostname } +func (v HostinfoView) ShieldsUp() bool { return v.ж.ShieldsUp } +func (v HostinfoView) ShareeNode() bool { return v.ж.ShareeNode } +func (v HostinfoView) GoArch() string { return v.ж.GoArch } +func (v HostinfoView) RoutableIPs() views.IPPrefixSlice { + return views.IPPrefixSliceOf(v.ж.RoutableIPs) +} +func (v HostinfoView) RequestTags() views.Slice[string] { return views.SliceOf(v.ж.RequestTags) } +func (v HostinfoView) Services() views.Slice[Service] { return views.SliceOf(v.ж.Services) } +func (v HostinfoView) NetInfo() NetInfoView { return v.ж.NetInfo.View() } +func (v HostinfoView) SSH_HostKeys() views.Slice[string] { return views.SliceOf(v.ж.SSH_HostKeys) } +func (v HostinfoView) Equal(v2 HostinfoView) bool { return v.ж.Equal(v2.ж) } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _HostinfoViewNeedsRegeneration = Hostinfo(struct { + IPNVersion string + FrontendLogID string + BackendLogID string + OS string + OSVersion string + Desktop opt.Bool + Package string + DeviceModel string + Hostname string + ShieldsUp bool + ShareeNode bool + GoArch string + RoutableIPs []netaddr.IPPrefix + RequestTags []string + Services []Service + NetInfo *NetInfo + SSH_HostKeys []string +}{}) + +// View returns a readonly view of NetInfo. +func (p *NetInfo) View() NetInfoView { + return NetInfoView{ж: p} +} + +// NetInfoView provides a read-only view over NetInfo. +// +// Its methods should only be called if `Valid()` returns true. type NetInfoView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. // It is named distinctively to make you think of how dangerous it is to escape // to callers. You must not let callers be able to mutate it. ж *NetInfo } -// Valid reports whether the underlying value is not nil. +// Valid reports whether underlying value is non-nil. func (v NetInfoView) Valid() bool { return v.ж != nil } -// AsStruct returns a deep-copy of the underlying value. -func (v NetInfoView) AsStruct() *NetInfo { return v.ж.Clone() } +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v NetInfoView) AsStruct() *NetInfo { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v NetInfoView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *NetInfoView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x NetInfo + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} func (v NetInfoView) MappingVariesByDestIP() opt.Bool { return v.ж.MappingVariesByDestIP } func (v NetInfoView) HairPinning() opt.Bool { return v.ж.HairPinning } @@ -108,9 +345,404 @@ func (v NetInfoView) PreferredDERP() int { return v.ж.PreferredDER func (v NetInfoView) LinkType() string { return v.ж.LinkType } func (v NetInfoView) String() string { return v.ж.String() } -// DERPLatencyForEach calls fn for each value in the DERPLatency map. -func (v NetInfoView) DERPLatencyForEach(fn func(k string, v float64)) { - for k, v := range v.ж.DERPLatency { - fn(k, v) +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _NetInfoViewNeedsRegeneration = NetInfo(struct { + MappingVariesByDestIP opt.Bool + HairPinning opt.Bool + WorkingIPv6 opt.Bool + WorkingUDP opt.Bool + HavePortMap bool + UPnP opt.Bool + PMP opt.Bool + PCP opt.Bool + PreferredDERP int + LinkType string + DERPLatency map[string]float64 +}{}) + +// View returns a readonly view of Login. +func (p *Login) View() LoginView { + return LoginView{ж: p} +} + +// LoginView provides a read-only view over Login. +// +// Its methods should only be called if `Valid()` returns true. +type LoginView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *Login +} + +// Valid reports whether underlying value is non-nil. +func (v LoginView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v LoginView) AsStruct() *Login { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v LoginView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *LoginView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x Login + if err := json.Unmarshal(b, &x); err != nil { + return err } + v.ж = &x + return nil +} + +func (v LoginView) ID() LoginID { return v.ж.ID } +func (v LoginView) Provider() string { return v.ж.Provider } +func (v LoginView) LoginName() string { return v.ж.LoginName } +func (v LoginView) DisplayName() string { return v.ж.DisplayName } +func (v LoginView) ProfilePicURL() string { return v.ж.ProfilePicURL } +func (v LoginView) Domain() string { return v.ж.Domain } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _LoginViewNeedsRegeneration = Login(struct { + _ structs.Incomparable + ID LoginID + Provider string + LoginName string + DisplayName string + ProfilePicURL string + Domain string +}{}) + +// View returns a readonly view of DNSConfig. +func (p *DNSConfig) View() DNSConfigView { + return DNSConfigView{ж: p} +} + +// DNSConfigView provides a read-only view over DNSConfig. +// +// Its methods should only be called if `Valid()` returns true. +type DNSConfigView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *DNSConfig } + +// Valid reports whether underlying value is non-nil. +func (v DNSConfigView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v DNSConfigView) AsStruct() *DNSConfig { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v DNSConfigView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *DNSConfigView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x DNSConfig + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v DNSConfigView) Resolvers() views.SliceView[*dnstype.Resolver, dnstype.ResolverView] { + return views.SliceOfViews[*dnstype.Resolver, dnstype.ResolverView](v.ж.Resolvers) +} +func (v DNSConfigView) FallbackResolvers() views.SliceView[*dnstype.Resolver, dnstype.ResolverView] { + return views.SliceOfViews[*dnstype.Resolver, dnstype.ResolverView](v.ж.FallbackResolvers) +} +func (v DNSConfigView) Domains() views.Slice[string] { return views.SliceOf(v.ж.Domains) } +func (v DNSConfigView) Proxied() bool { return v.ж.Proxied } +func (v DNSConfigView) Nameservers() views.Slice[netaddr.IP] { return views.SliceOf(v.ж.Nameservers) } +func (v DNSConfigView) PerDomain() bool { return v.ж.PerDomain } +func (v DNSConfigView) CertDomains() views.Slice[string] { return views.SliceOf(v.ж.CertDomains) } +func (v DNSConfigView) ExtraRecords() views.Slice[DNSRecord] { return views.SliceOf(v.ж.ExtraRecords) } +func (v DNSConfigView) ExitNodeFilteredSet() views.Slice[string] { + return views.SliceOf(v.ж.ExitNodeFilteredSet) +} + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _DNSConfigViewNeedsRegeneration = DNSConfig(struct { + Resolvers []*dnstype.Resolver + Routes map[string][]*dnstype.Resolver + FallbackResolvers []*dnstype.Resolver + Domains []string + Proxied bool + Nameservers []netaddr.IP + PerDomain bool + CertDomains []string + ExtraRecords []DNSRecord + ExitNodeFilteredSet []string +}{}) + +// View returns a readonly view of RegisterResponse. +func (p *RegisterResponse) View() RegisterResponseView { + return RegisterResponseView{ж: p} +} + +// RegisterResponseView provides a read-only view over RegisterResponse. +// +// Its methods should only be called if `Valid()` returns true. +type RegisterResponseView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *RegisterResponse +} + +// Valid reports whether underlying value is non-nil. +func (v RegisterResponseView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v RegisterResponseView) AsStruct() *RegisterResponse { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v RegisterResponseView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *RegisterResponseView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x RegisterResponse + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v RegisterResponseView) User() UserView { return v.ж.User.View() } +func (v RegisterResponseView) Login() Login { return v.ж.Login } +func (v RegisterResponseView) NodeKeyExpired() bool { return v.ж.NodeKeyExpired } +func (v RegisterResponseView) MachineAuthorized() bool { return v.ж.MachineAuthorized } +func (v RegisterResponseView) AuthURL() string { return v.ж.AuthURL } +func (v RegisterResponseView) Error() string { return v.ж.Error } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _RegisterResponseViewNeedsRegeneration = RegisterResponse(struct { + User User + Login Login + NodeKeyExpired bool + MachineAuthorized bool + AuthURL string + Error string +}{}) + +// View returns a readonly view of DERPRegion. +func (p *DERPRegion) View() DERPRegionView { + return DERPRegionView{ж: p} +} + +// DERPRegionView provides a read-only view over DERPRegion. +// +// Its methods should only be called if `Valid()` returns true. +type DERPRegionView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *DERPRegion +} + +// Valid reports whether underlying value is non-nil. +func (v DERPRegionView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v DERPRegionView) AsStruct() *DERPRegion { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v DERPRegionView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *DERPRegionView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x DERPRegion + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v DERPRegionView) RegionID() int { return v.ж.RegionID } +func (v DERPRegionView) RegionCode() string { return v.ж.RegionCode } +func (v DERPRegionView) RegionName() string { return v.ж.RegionName } +func (v DERPRegionView) Avoid() bool { return v.ж.Avoid } +func (v DERPRegionView) Nodes() views.SliceView[*DERPNode, DERPNodeView] { + return views.SliceOfViews[*DERPNode, DERPNodeView](v.ж.Nodes) +} + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _DERPRegionViewNeedsRegeneration = DERPRegion(struct { + RegionID int + RegionCode string + RegionName string + Avoid bool + Nodes []*DERPNode +}{}) + +// View returns a readonly view of DERPMap. +func (p *DERPMap) View() DERPMapView { + return DERPMapView{ж: p} +} + +// DERPMapView provides a read-only view over DERPMap. +// +// Its methods should only be called if `Valid()` returns true. +type DERPMapView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *DERPMap +} + +// Valid reports whether underlying value is non-nil. +func (v DERPMapView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v DERPMapView) AsStruct() *DERPMap { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v DERPMapView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *DERPMapView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x DERPMap + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v DERPMapView) OmitDefaultRegions() bool { return v.ж.OmitDefaultRegions } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _DERPMapViewNeedsRegeneration = DERPMap(struct { + Regions map[int]*DERPRegion + OmitDefaultRegions bool +}{}) + +// View returns a readonly view of DERPNode. +func (p *DERPNode) View() DERPNodeView { + return DERPNodeView{ж: p} +} + +// DERPNodeView provides a read-only view over DERPNode. +// +// Its methods should only be called if `Valid()` returns true. +type DERPNodeView struct { + // ж is the underlying mutable value, named with a hard-to-type + // character that looks pointy like a pointer. + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *DERPNode +} + +// Valid reports whether underlying value is non-nil. +func (v DERPNodeView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v DERPNodeView) AsStruct() *DERPNode { + if v.ж == nil { + return nil + } + return v.ж.Clone() +} + +func (v DERPNodeView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *DERPNodeView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x DERPNode + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v DERPNodeView) Name() string { return v.ж.Name } +func (v DERPNodeView) RegionID() int { return v.ж.RegionID } +func (v DERPNodeView) HostName() string { return v.ж.HostName } +func (v DERPNodeView) CertName() string { return v.ж.CertName } +func (v DERPNodeView) IPv4() string { return v.ж.IPv4 } +func (v DERPNodeView) IPv6() string { return v.ж.IPv6 } +func (v DERPNodeView) STUNPort() int { return v.ж.STUNPort } +func (v DERPNodeView) STUNOnly() bool { return v.ж.STUNOnly } +func (v DERPNodeView) DERPPort() int { return v.ж.DERPPort } +func (v DERPNodeView) InsecureForTests() bool { return v.ж.InsecureForTests } +func (v DERPNodeView) STUNTestIP() string { return v.ж.STUNTestIP } + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _DERPNodeViewNeedsRegeneration = DERPNode(struct { + Name string + RegionID int + HostName string + CertName string + IPv4 string + IPv6 string + STUNPort int + STUNOnly bool + DERPPort int + InsecureForTests bool + STUNTestIP string +}{}) diff --git a/types/dnstype/dnstype_view.go b/types/dnstype/dnstype_view.go new file mode 100644 index 000000000..dcc196603 --- /dev/null +++ b/types/dnstype/dnstype_view.go @@ -0,0 +1,69 @@ +// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by tailscale.com/util/codegen (viewer); DO NOT EDIT. + +package dnstype + +import ( + "encoding/json" + "errors" + + "inet.af/netaddr" + "tailscale.com/types/views" +) + +//go:generate go run tailscale.com/cmd/cloner -clonefunc=true -type=Resolver +// View returns a readonly view of Resolver. +func (p *Resolver) View() ResolverView { + return ResolverView{ж: p} +} + +// ResolverView provides a read-only view on Resolver. +// It's methods should only be called if `Valid()` returns true. +type ResolverView struct { + // It is named distinctively to make you think of how dangerous it is to escape + // to callers. You must not let callers be able to mutate it. + ж *Resolver +} + +// Valid reports whether underlying value is non-nil. +func (v ResolverView) Valid() bool { return v.ж != nil } + +// AsStruct returns a clone of the underlying value which aliases no memory with +// the original. +func (v ResolverView) AsStruct() *Resolver { + if v.ж != nil { + return nil + } + return v.ж.Clone() +} + +func (v ResolverView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) } + +func (v *ResolverView) UnmarshalJSON(b []byte) error { + if v.ж != nil { + return errors.New("already initialized") + } + if len(b) == 0 { + return nil + } + var x Resolver + if err := json.Unmarshal(b, &x); err != nil { + return err + } + v.ж = &x + return nil +} + +func (v ResolverView) Addr() string { return v.ж.Addr } +func (v ResolverView) BootstrapResolution() views.Slice[netaddr.IP] { + return views.SliceOf(v.ж.BootstrapResolution) +} + +// A compilation failure here means this code must be regenerated, with the command at the top of this file. +var _ResolverViewNeedsRegeneration = Resolver(struct { + Addr string + BootstrapResolution []netaddr.IP +}{})