package jsonopts
import (
)
type Options interface {
JSONOptions(internal.NotForPublicUse)
}
type experimentalFormatTagSupporter interface{ ExperimentalSupportFormatTag() bool }
type Struct struct {
Flags jsonflags.Flags
CoderValues
ArshalValues
}
type CoderValues struct {
Indent string
IndentPrefix string
ByteLimit int64
DepthLimit int
}
type ArshalValues struct {
Marshalers any
Unmarshalers any
Format string
}
var DefaultOptionsV2 = Struct{
Flags: jsonflags.Flags{
Presence: uint64(jsonflags.DefaultV1Flags),
Values: uint64(0),
},
}
var DefaultOptionsV1 = Struct{
Flags: jsonflags.Flags{
Presence: uint64(jsonflags.DefaultV1Flags),
Values: uint64(jsonflags.DefaultV1Flags),
},
}
func (*Struct) (internal.NotForPublicUse) {}
var GetUnknownOption = func(Struct, Options) (any, bool) { panic("unknown option") }
func [ any]( Options, func() Options) (, bool) {
, := .(*Struct)
if ! {
var Struct
.Join()
= &
}
var
switch opt := ().(type) {
case jsonflags.Bools:
:= .Flags.Get()
:= .Flags.Has()
if ! && == jsonflags.StringifyNumbers && .Flags.Get(jsonflags.StringTag) {
return any(true).(), true
}
return any().(),
case experimentalFormatTagSupporter:
:= .Flags.Get(jsonflags.FormatTagSupported)
:= .Flags.Has(jsonflags.FormatTagSupported)
return any().(),
case Indent:
if !.Flags.Has(jsonflags.Indent) {
return , false
}
return any(.Indent).(), true
case IndentPrefix:
if !.Flags.Has(jsonflags.IndentPrefix) {
return , false
}
return any(.IndentPrefix).(), true
case ByteLimit:
if !.Flags.Has(jsonflags.ByteLimit) {
return , false
}
return any(.ByteLimit).(), true
case DepthLimit:
if !.Flags.Has(jsonflags.DepthLimit) {
return , false
}
return any(.DepthLimit).(), true
default:
, := GetUnknownOption(*, )
return .(),
}
}
var JoinUnknownOption = func(Struct, Options) Struct { panic("unknown option") }
func ( *Struct) ( ...Options) {
for , := range {
switch src := .(type) {
case nil:
continue
case jsonflags.Bools:
.Flags.Set()
case experimentalFormatTagSupporter:
if .ExperimentalSupportFormatTag() {
.Flags.Set(jsonflags.FormatTagSupported | 1)
} else {
.Flags.Set(jsonflags.FormatTagSupported | 0)
}
case Indent:
.Flags.Set(jsonflags.Multiline | jsonflags.Indent | 1)
.Indent = string()
case IndentPrefix:
.Flags.Set(jsonflags.Multiline | jsonflags.IndentPrefix | 1)
.IndentPrefix = string()
case ByteLimit:
.Flags.Set(jsonflags.ByteLimit | 1)
.ByteLimit = int64()
case DepthLimit:
.Flags.Set(jsonflags.DepthLimit | 1)
.DepthLimit = int()
case *Struct:
.Flags.Join(.Flags)
if .Flags.Has(jsonflags.NonBooleanFlags) {
if .Flags.Has(jsonflags.Indent) {
.Indent = .Indent
}
if .Flags.Has(jsonflags.IndentPrefix) {
.IndentPrefix = .IndentPrefix
}
if .Flags.Has(jsonflags.ByteLimit) {
.ByteLimit = .ByteLimit
}
if .Flags.Has(jsonflags.DepthLimit) {
.DepthLimit = .DepthLimit
}
if .Flags.Has(jsonflags.Marshalers) {
.Marshalers = .Marshalers
}
if .Flags.Has(jsonflags.Unmarshalers) {
.Unmarshalers = .Unmarshalers
}
if .Flags.Has(jsonflags.FormatTag) {
.Format = .Format
}
}
default:
* = JoinUnknownOption(*, )
}
}
}
func ( *Struct) () {
if !.Flags.Has(jsonflags.SpaceAfterColon) {
.Flags.Set(jsonflags.SpaceAfterColon | 1)
}
if !.Flags.Has(jsonflags.SpaceAfterComma) {
.Flags.Set(jsonflags.SpaceAfterComma | 0)
}
if !.Flags.Has(jsonflags.Indent) {
.Flags.Set(jsonflags.Indent | 1)
.Indent = "\t"
}
}
func (, Struct) bool {
return .Flags.Get(jsonflags.Multiline) != .Flags.Get(jsonflags.Multiline) ||
.Flags.Get(jsonflags.SpaceAfterColon) != .Flags.Get(jsonflags.SpaceAfterColon) ||
.Flags.Get(jsonflags.SpaceAfterComma) != .Flags.Get(jsonflags.SpaceAfterComma) ||
(.Flags.Get(jsonflags.Multiline) && (.Indent != .Indent || .IndentPrefix != .IndentPrefix))
}
type (
Indent string
IndentPrefix string
ByteLimit int64
DepthLimit int
)
func (Indent) (internal.NotForPublicUse) {}
func (IndentPrefix) (internal.NotForPublicUse) {}
func (ByteLimit) (internal.NotForPublicUse) {}
func (DepthLimit) (internal.NotForPublicUse) {}