mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 21:15:39 +00:00
67df9abdc6
Package setting contains types for defining and representing policy settings. It facilitates the registration of setting definitions using Register and RegisterDefinition, and the retrieval of registered setting definitions via Definitions and DefinitionOf. This package is intended for use primarily within the syspolicy package hierarchy, and added in a preparation for the next PRs. Updates #12687 Signed-off-by: Nick Khyl <nickk@tailscale.com>
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package setting
|
|
|
|
import (
|
|
jsonv2 "github.com/go-json-experiment/json"
|
|
"github.com/go-json-experiment/json/jsontext"
|
|
"tailscale.com/types/opt"
|
|
)
|
|
|
|
// Summary is an immutable [PolicyScope] and [Origin].
|
|
type Summary struct {
|
|
data summary
|
|
}
|
|
|
|
type summary struct {
|
|
Scope opt.Value[PolicyScope] `json:",omitzero"`
|
|
Origin opt.Value[Origin] `json:",omitzero"`
|
|
}
|
|
|
|
// SummaryWith returns a [Summary] with the specified options.
|
|
func SummaryWith(opts ...SummaryOption) Summary {
|
|
var summary Summary
|
|
for _, o := range opts {
|
|
o.applySummaryOption(&summary)
|
|
}
|
|
return summary
|
|
}
|
|
|
|
// IsEmpty reports whether s is empty.
|
|
func (s Summary) IsEmpty() bool {
|
|
return s == Summary{}
|
|
}
|
|
|
|
// Scope reports the [PolicyScope] in s.
|
|
func (s Summary) Scope() opt.Value[PolicyScope] {
|
|
return s.data.Scope
|
|
}
|
|
|
|
// Origin reports the [Origin] in s.
|
|
func (s Summary) Origin() opt.Value[Origin] {
|
|
return s.data.Origin
|
|
}
|
|
|
|
// String implements [fmt.Stringer].
|
|
func (s Summary) String() string {
|
|
if s.IsEmpty() {
|
|
return "{Empty}"
|
|
}
|
|
if origin, ok := s.data.Origin.GetOk(); ok {
|
|
return origin.String()
|
|
}
|
|
return s.data.Scope.String()
|
|
}
|
|
|
|
// MarshalJSONV2 implements [jsonv2.MarshalerV2].
|
|
func (s Summary) MarshalJSONV2(out *jsontext.Encoder, opts jsonv2.Options) error {
|
|
return jsonv2.MarshalEncode(out, &s.data, opts)
|
|
}
|
|
|
|
// UnmarshalJSONV2 implements [jsonv2.UnmarshalerV2].
|
|
func (s *Summary) UnmarshalJSONV2(in *jsontext.Decoder, opts jsonv2.Options) error {
|
|
return jsonv2.UnmarshalDecode(in, &s.data, opts)
|
|
}
|
|
|
|
// MarshalJSON implements [json.Marshaler].
|
|
func (s Summary) MarshalJSON() ([]byte, error) {
|
|
return jsonv2.Marshal(s) // uses MarshalJSONV2
|
|
}
|
|
|
|
// UnmarshalJSON implements [json.Unmarshaler].
|
|
func (s *Summary) UnmarshalJSON(b []byte) error {
|
|
return jsonv2.Unmarshal(b, s) // uses UnmarshalJSONV2
|
|
}
|
|
|
|
// SummaryOption is an option that configures [Summary]
|
|
// The following are allowed options:
|
|
//
|
|
// - [Summary]
|
|
// - [PolicyScope]
|
|
// - [Origin]
|
|
type SummaryOption interface {
|
|
applySummaryOption(summary *Summary)
|
|
}
|
|
|
|
func (s PolicyScope) applySummaryOption(summary *Summary) {
|
|
summary.data.Scope.Set(s)
|
|
}
|
|
|
|
func (o Origin) applySummaryOption(summary *Summary) {
|
|
summary.data.Origin.Set(o)
|
|
if !summary.data.Scope.IsSet() {
|
|
summary.data.Scope.Set(o.Scope())
|
|
}
|
|
}
|
|
|
|
func (s Summary) applySummaryOption(summary *Summary) {
|
|
*summary = s
|
|
}
|