2023-01-27 13:37:20 -08:00
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
2022-10-21 23:05:43 +00:00
// Code generated by tailscale/cmd/viewer; DO NOT EDIT.
package ipn
import (
"encoding/json"
"errors"
"net/netip"
2024-04-02 13:32:30 -07:00
"tailscale.com/drive"
2022-10-21 23:05:43 +00:00
"tailscale.com/tailcfg"
2024-05-06 15:22:17 -07:00
"tailscale.com/types/opt"
2022-10-21 23:05:43 +00:00
"tailscale.com/types/persist"
"tailscale.com/types/preftype"
"tailscale.com/types/views"
)
2025-01-30 11:24:25 -06:00
//go:generate go run tailscale.com/cmd/cloner -clonefunc=false -type=LoginProfile,Prefs,ServeConfig,ServiceConfig,TCPPortHandler,HTTPHandler,WebServerConfig
// View returns a read-only view of LoginProfile.
func ( p * LoginProfile ) View ( ) LoginProfileView {
return LoginProfileView { ж : p }
}
// LoginProfileView provides a read-only view over LoginProfile.
//
// Its methods should only be called if `Valid()` returns true.
type LoginProfileView 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.
ж * LoginProfile
}
// Valid reports whether v's underlying value is non-nil.
func ( v LoginProfileView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v LoginProfileView ) AsStruct ( ) * LoginProfile {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v LoginProfileView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * LoginProfileView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x LoginProfile
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
func ( v LoginProfileView ) ID ( ) ProfileID { return v . ж . ID }
func ( v LoginProfileView ) Name ( ) string { return v . ж . Name }
func ( v LoginProfileView ) NetworkProfile ( ) NetworkProfile { return v . ж . NetworkProfile }
func ( v LoginProfileView ) Key ( ) StateKey { return v . ж . Key }
func ( v LoginProfileView ) UserProfile ( ) tailcfg . UserProfile { return v . ж . UserProfile }
func ( v LoginProfileView ) NodeID ( ) tailcfg . StableNodeID { return v . ж . NodeID }
func ( v LoginProfileView ) LocalUserID ( ) WindowsUserID { return v . ж . LocalUserID }
func ( v LoginProfileView ) ControlURL ( ) string { return v . ж . ControlURL }
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _LoginProfileViewNeedsRegeneration = LoginProfile ( struct {
ID ProfileID
Name string
NetworkProfile NetworkProfile
Key StateKey
UserProfile tailcfg . UserProfile
NodeID tailcfg . StableNodeID
LocalUserID WindowsUserID
ControlURL string
} { } )
2022-10-21 23:05:43 +00:00
2025-01-14 08:15:27 -08:00
// View returns a read-only view of Prefs.
2022-10-21 23:05:43 +00:00
func ( p * Prefs ) View ( ) PrefsView {
return PrefsView { ж : p }
}
// PrefsView provides a read-only view over Prefs.
//
// Its methods should only be called if `Valid()` returns true.
type PrefsView 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.
ж * Prefs
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2022-10-21 23:05:43 +00:00
func ( v PrefsView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v PrefsView ) AsStruct ( ) * Prefs {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v PrefsView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * PrefsView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x Prefs
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
2024-04-16 14:53:56 -04:00
func ( v PrefsView ) ControlURL ( ) string { return v . ж . ControlURL }
func ( v PrefsView ) RouteAll ( ) bool { return v . ж . RouteAll }
func ( v PrefsView ) ExitNodeID ( ) tailcfg . StableNodeID { return v . ж . ExitNodeID }
func ( v PrefsView ) ExitNodeIP ( ) netip . Addr { return v . ж . ExitNodeIP }
cmd/tailscale/cli,ipn,ipn/ipnlocal: add AutoExitNode preference for automatic exit node selection
With this change, policy enforcement and exit node resolution can happen in separate steps,
since enforcement no longer depends on resolving the suggested exit node. This keeps policy
enforcement synchronous (e.g., when switching profiles), while allowing exit node resolution
to be asynchronous on netmap updates, link changes, etc.
Additionally, the new preference will be used to let GUIs and CLIs switch back to "auto" mode
after a manual exit node override, which is necessary for tailscale/corp#29969.
Updates tailscale/corp#29969
Updates #16459
Signed-off-by: Nick Khyl <nickk@tailscale.com>
2025-07-03 12:21:29 -05:00
func ( v PrefsView ) AutoExitNode ( ) ExitNodeExpression { return v . ж . AutoExitNode }
2024-04-16 14:53:56 -04:00
func ( v PrefsView ) InternalExitNodePrior ( ) tailcfg . StableNodeID { return v . ж . InternalExitNodePrior }
func ( v PrefsView ) ExitNodeAllowLANAccess ( ) bool { return v . ж . ExitNodeAllowLANAccess }
func ( v PrefsView ) CorpDNS ( ) bool { return v . ж . CorpDNS }
func ( v PrefsView ) RunSSH ( ) bool { return v . ж . RunSSH }
func ( v PrefsView ) RunWebClient ( ) bool { return v . ж . RunWebClient }
func ( v PrefsView ) WantRunning ( ) bool { return v . ж . WantRunning }
func ( v PrefsView ) LoggedOut ( ) bool { return v . ж . LoggedOut }
func ( v PrefsView ) ShieldsUp ( ) bool { return v . ж . ShieldsUp }
func ( v PrefsView ) AdvertiseTags ( ) views . Slice [ string ] { return views . SliceOf ( v . ж . AdvertiseTags ) }
func ( v PrefsView ) Hostname ( ) string { return v . ж . Hostname }
func ( v PrefsView ) NotepadURLs ( ) bool { return v . ж . NotepadURLs }
func ( v PrefsView ) ForceDaemon ( ) bool { return v . ж . ForceDaemon }
func ( v PrefsView ) Egg ( ) bool { return v . ж . Egg }
2023-08-18 10:57:04 -07:00
func ( v PrefsView ) AdvertiseRoutes ( ) views . Slice [ netip . Prefix ] {
return views . SliceOf ( v . ж . AdvertiseRoutes )
2022-10-21 23:05:43 +00:00
}
2024-10-16 19:08:06 -04:00
func ( v PrefsView ) AdvertiseServices ( ) views . Slice [ string ] {
return views . SliceOf ( v . ж . AdvertiseServices )
}
2022-10-21 23:05:43 +00:00
func ( v PrefsView ) NoSNAT ( ) bool { return v . ж . NoSNAT }
2024-05-06 15:22:17 -07:00
func ( v PrefsView ) NoStatefulFiltering ( ) opt . Bool { return v . ж . NoStatefulFiltering }
2022-10-21 23:05:43 +00:00
func ( v PrefsView ) NetfilterMode ( ) preftype . NetfilterMode { return v . ж . NetfilterMode }
func ( v PrefsView ) OperatorUser ( ) string { return v . ж . OperatorUser }
2022-11-18 14:42:32 +05:00
func ( v PrefsView ) ProfileName ( ) string { return v . ж . ProfileName }
2023-09-01 14:45:12 -06:00
func ( v PrefsView ) AutoUpdate ( ) AutoUpdatePrefs { return v . ж . AutoUpdate }
2023-10-26 15:55:32 -07:00
func ( v PrefsView ) AppConnector ( ) AppConnectorPrefs { return v . ж . AppConnector }
2023-10-03 11:46:24 +02:00
func ( v PrefsView ) PostureChecking ( ) bool { return v . ж . PostureChecking }
2023-12-04 12:08:56 -05:00
func ( v PrefsView ) NetfilterKind ( ) string { return v . ж . NetfilterKind }
2024-04-03 10:09:58 -07:00
func ( v PrefsView ) DriveShares ( ) views . SliceView [ * drive . Share , drive . ShareView ] {
return views . SliceOfViews [ * drive . Share , drive . ShareView ] ( v . ж . DriveShares )
2024-03-07 10:56:11 -06:00
}
2025-04-09 10:25:57 -07:00
func ( v PrefsView ) RelayServerPort ( ) views . ValuePointer [ int ] {
return views . ValuePointerOf ( v . ж . RelayServerPort )
}
2024-05-17 13:47:57 -07:00
func ( v PrefsView ) AllowSingleHosts ( ) marshalAsTrueInJSON { return v . ж . AllowSingleHosts }
func ( v PrefsView ) Persist ( ) persist . PersistView { return v . ж . Persist . View ( ) }
2022-10-21 23:05:43 +00:00
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _PrefsViewNeedsRegeneration = Prefs ( struct {
ControlURL string
RouteAll bool
ExitNodeID tailcfg . StableNodeID
ExitNodeIP netip . Addr
cmd/tailscale/cli,ipn,ipn/ipnlocal: add AutoExitNode preference for automatic exit node selection
With this change, policy enforcement and exit node resolution can happen in separate steps,
since enforcement no longer depends on resolving the suggested exit node. This keeps policy
enforcement synchronous (e.g., when switching profiles), while allowing exit node resolution
to be asynchronous on netmap updates, link changes, etc.
Additionally, the new preference will be used to let GUIs and CLIs switch back to "auto" mode
after a manual exit node override, which is necessary for tailscale/corp#29969.
Updates tailscale/corp#29969
Updates #16459
Signed-off-by: Nick Khyl <nickk@tailscale.com>
2025-07-03 12:21:29 -05:00
AutoExitNode ExitNodeExpression
2024-04-16 14:53:56 -04:00
InternalExitNodePrior tailcfg . StableNodeID
2022-10-21 23:05:43 +00:00
ExitNodeAllowLANAccess bool
CorpDNS bool
RunSSH bool
2023-10-26 11:35:41 -07:00
RunWebClient bool
2022-10-21 23:05:43 +00:00
WantRunning bool
LoggedOut bool
ShieldsUp bool
AdvertiseTags [ ] string
Hostname string
NotepadURLs bool
ForceDaemon bool
Egg bool
AdvertiseRoutes [ ] netip . Prefix
2024-10-16 19:08:06 -04:00
AdvertiseServices [ ] string
2022-10-21 23:05:43 +00:00
NoSNAT bool
2024-05-06 15:22:17 -07:00
NoStatefulFiltering opt . Bool
2022-10-21 23:05:43 +00:00
NetfilterMode preftype . NetfilterMode
OperatorUser string
2022-11-18 14:42:32 +05:00
ProfileName string
2023-09-01 14:45:12 -06:00
AutoUpdate AutoUpdatePrefs
2023-10-26 15:55:32 -07:00
AppConnector AppConnectorPrefs
2023-10-03 11:46:24 +02:00
PostureChecking bool
2023-12-04 12:08:56 -05:00
NetfilterKind string
2024-04-03 10:09:58 -07:00
DriveShares [ ] * drive . Share
2025-04-09 10:25:57 -07:00
RelayServerPort * int
2024-05-17 13:47:57 -07:00
AllowSingleHosts marshalAsTrueInJSON
2022-10-21 23:05:43 +00:00
Persist * persist . Persist
} { } )
2022-11-09 06:10:06 -08:00
2025-01-14 08:15:27 -08:00
// View returns a read-only view of ServeConfig.
2022-11-09 06:10:06 -08:00
func ( p * ServeConfig ) View ( ) ServeConfigView {
return ServeConfigView { ж : p }
}
// ServeConfigView provides a read-only view over ServeConfig.
//
// Its methods should only be called if `Valid()` returns true.
type ServeConfigView 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.
ж * ServeConfig
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2022-11-09 06:10:06 -08:00
func ( v ServeConfigView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v ServeConfigView ) AsStruct ( ) * ServeConfig {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v ServeConfigView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * ServeConfigView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x ServeConfig
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
2022-11-10 22:58:40 -05:00
func ( v ServeConfigView ) TCP ( ) views . MapFn [ uint16 , * TCPPortHandler , TCPPortHandlerView ] {
2022-11-09 06:10:06 -08:00
return views . MapFnOf ( v . ж . TCP , func ( t * TCPPortHandler ) TCPPortHandlerView {
return t . View ( )
} )
}
func ( v ServeConfigView ) Web ( ) views . MapFn [ HostPort , * WebServerConfig , WebServerConfigView ] {
return views . MapFnOf ( v . ж . Web , func ( t * WebServerConfig ) WebServerConfigView {
return t . View ( )
} )
}
2025-01-21 17:07:34 -05:00
func ( v ServeConfigView ) Services ( ) views . MapFn [ tailcfg . ServiceName , * ServiceConfig , ServiceConfigView ] {
2024-11-28 12:49:37 -05:00
return views . MapFnOf ( v . ж . Services , func ( t * ServiceConfig ) ServiceConfigView {
return t . View ( )
} )
}
2022-11-17 16:09:43 -05:00
func ( v ServeConfigView ) AllowFunnel ( ) views . Map [ HostPort , bool ] {
return views . MapOf ( v . ж . AllowFunnel )
2022-11-07 10:46:42 -05:00
}
2023-09-05 14:33:18 -04:00
func ( v ServeConfigView ) Foreground ( ) views . MapFn [ string , * ServeConfig , ServeConfigView ] {
return views . MapFnOf ( v . ж . Foreground , func ( t * ServeConfig ) ServeConfigView {
return t . View ( )
} )
}
2023-09-11 21:32:51 -04:00
func ( v ServeConfigView ) ETag ( ) string { return v . ж . ETag }
2023-09-05 14:33:18 -04:00
2022-11-09 06:10:06 -08:00
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _ServeConfigViewNeedsRegeneration = ServeConfig ( struct {
2022-11-17 16:09:43 -05:00
TCP map [ uint16 ] * TCPPortHandler
Web map [ HostPort ] * WebServerConfig
2025-01-21 17:07:34 -05:00
Services map [ tailcfg . ServiceName ] * ServiceConfig
2022-11-17 16:09:43 -05:00
AllowFunnel map [ HostPort ] bool
2023-09-05 14:33:18 -04:00
Foreground map [ string ] * ServeConfig
2023-09-11 21:32:51 -04:00
ETag string
2022-11-09 06:10:06 -08:00
} { } )
2025-01-14 08:15:27 -08:00
// View returns a read-only view of ServiceConfig.
2024-11-28 12:49:37 -05:00
func ( p * ServiceConfig ) View ( ) ServiceConfigView {
return ServiceConfigView { ж : p }
}
// ServiceConfigView provides a read-only view over ServiceConfig.
//
// Its methods should only be called if `Valid()` returns true.
type ServiceConfigView 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.
ж * ServiceConfig
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2024-11-28 12:49:37 -05:00
func ( v ServiceConfigView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v ServiceConfigView ) AsStruct ( ) * ServiceConfig {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v ServiceConfigView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * ServiceConfigView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x ServiceConfig
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
func ( v ServiceConfigView ) TCP ( ) views . MapFn [ uint16 , * TCPPortHandler , TCPPortHandlerView ] {
return views . MapFnOf ( v . ж . TCP , func ( t * TCPPortHandler ) TCPPortHandlerView {
return t . View ( )
} )
}
func ( v ServiceConfigView ) Web ( ) views . MapFn [ HostPort , * WebServerConfig , WebServerConfigView ] {
return views . MapFnOf ( v . ж . Web , func ( t * WebServerConfig ) WebServerConfigView {
return t . View ( )
} )
}
func ( v ServiceConfigView ) Tun ( ) bool { return v . ж . Tun }
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _ServiceConfigViewNeedsRegeneration = ServiceConfig ( struct {
TCP map [ uint16 ] * TCPPortHandler
Web map [ HostPort ] * WebServerConfig
Tun bool
} { } )
2025-01-14 08:15:27 -08:00
// View returns a read-only view of TCPPortHandler.
2022-11-09 06:10:06 -08:00
func ( p * TCPPortHandler ) View ( ) TCPPortHandlerView {
return TCPPortHandlerView { ж : p }
}
// TCPPortHandlerView provides a read-only view over TCPPortHandler.
//
// Its methods should only be called if `Valid()` returns true.
type TCPPortHandlerView 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.
ж * TCPPortHandler
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2022-11-09 06:10:06 -08:00
func ( v TCPPortHandlerView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v TCPPortHandlerView ) AsStruct ( ) * TCPPortHandler {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v TCPPortHandlerView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * TCPPortHandlerView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x TCPPortHandler
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
2022-11-10 21:24:22 -08:00
func ( v TCPPortHandlerView ) HTTPS ( ) bool { return v . ж . HTTPS }
2023-06-21 12:32:20 -04:00
func ( v TCPPortHandlerView ) HTTP ( ) bool { return v . ж . HTTP }
2022-11-10 21:24:22 -08:00
func ( v TCPPortHandlerView ) TCPForward ( ) string { return v . ж . TCPForward }
func ( v TCPPortHandlerView ) TerminateTLS ( ) string { return v . ж . TerminateTLS }
2022-11-09 06:10:06 -08:00
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _TCPPortHandlerViewNeedsRegeneration = TCPPortHandler ( struct {
HTTPS bool
2023-06-21 12:32:20 -04:00
HTTP bool
2022-11-09 06:10:06 -08:00
TCPForward string
2022-11-10 21:24:22 -08:00
TerminateTLS string
2022-11-09 06:10:06 -08:00
} { } )
2025-01-14 08:15:27 -08:00
// View returns a read-only view of HTTPHandler.
2022-11-09 06:10:06 -08:00
func ( p * HTTPHandler ) View ( ) HTTPHandlerView {
return HTTPHandlerView { ж : p }
}
// HTTPHandlerView provides a read-only view over HTTPHandler.
//
// Its methods should only be called if `Valid()` returns true.
type HTTPHandlerView 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.
ж * HTTPHandler
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2022-11-09 06:10:06 -08:00
func ( v HTTPHandlerView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v HTTPHandlerView ) AsStruct ( ) * HTTPHandler {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v HTTPHandlerView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * HTTPHandlerView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x HTTPHandler
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
func ( v HTTPHandlerView ) Path ( ) string { return v . ж . Path }
func ( v HTTPHandlerView ) Proxy ( ) string { return v . ж . Proxy }
2022-11-09 06:55:17 -08:00
func ( v HTTPHandlerView ) Text ( ) string { return v . ж . Text }
2022-11-09 06:10:06 -08:00
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _HTTPHandlerViewNeedsRegeneration = HTTPHandler ( struct {
Path string
Proxy string
2022-11-09 06:55:17 -08:00
Text string
2022-11-09 06:10:06 -08:00
} { } )
2025-01-14 08:15:27 -08:00
// View returns a read-only view of WebServerConfig.
2022-11-09 06:10:06 -08:00
func ( p * WebServerConfig ) View ( ) WebServerConfigView {
return WebServerConfigView { ж : p }
}
// WebServerConfigView provides a read-only view over WebServerConfig.
//
// Its methods should only be called if `Valid()` returns true.
type WebServerConfigView 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.
ж * WebServerConfig
}
2025-01-14 08:15:27 -08:00
// Valid reports whether v's underlying value is non-nil.
2022-11-09 06:10:06 -08:00
func ( v WebServerConfigView ) Valid ( ) bool { return v . ж != nil }
// AsStruct returns a clone of the underlying value which aliases no memory with
// the original.
func ( v WebServerConfigView ) AsStruct ( ) * WebServerConfig {
if v . ж == nil {
return nil
}
return v . ж . Clone ( )
}
func ( v WebServerConfigView ) MarshalJSON ( ) ( [ ] byte , error ) { return json . Marshal ( v . ж ) }
func ( v * WebServerConfigView ) UnmarshalJSON ( b [ ] byte ) error {
if v . ж != nil {
return errors . New ( "already initialized" )
}
if len ( b ) == 0 {
return nil
}
var x WebServerConfig
if err := json . Unmarshal ( b , & x ) ; err != nil {
return err
}
v . ж = & x
return nil
}
func ( v WebServerConfigView ) Handlers ( ) views . MapFn [ string , * HTTPHandler , HTTPHandlerView ] {
return views . MapFnOf ( v . ж . Handlers , func ( t * HTTPHandler ) HTTPHandlerView {
return t . View ( )
} )
}
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _WebServerConfigViewNeedsRegeneration = WebServerConfig ( struct {
Handlers map [ string ] * HTTPHandler
} { } )