-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathencode_options.go
More file actions
130 lines (109 loc) · 3.42 KB
/
Copy pathencode_options.go
File metadata and controls
130 lines (109 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package jsonkit
import "github.com/forgemechanic/jsonkit/exp/profile"
// EncodeQuoteStyle controls output quote style for string literals.
type EncodeQuoteStyle uint8
const (
// EncodeQuoteDouble emits standard JSON double-quoted strings.
EncodeQuoteDouble EncodeQuoteStyle = iota
// EncodeQuoteSingle emits JSON5 single-quoted strings where possible.
EncodeQuoteSingle
// EncodeQuoteAuto chooses between single and double quoting by escape cost.
EncodeQuoteAuto
)
// EncodeCommentStyle controls emitted comment style.
type EncodeCommentStyle uint8
const (
// EncodeCommentNone disables comment emission.
EncodeCommentNone EncodeCommentStyle = iota
// EncodeCommentLine emits // comments.
EncodeCommentLine
// EncodeCommentBlock emits /* */ comments.
EncodeCommentBlock
)
// EncodeOption configures MarshalWithOptions and NewEncoderWithOptions.
type EncodeOption func(*encodeConfig)
type encodeConfig struct {
profileID profile.ProfileID
escapeHTML bool
indentPref string
indentVal string
validateOutput bool
quoteStyle EncodeQuoteStyle
unquotedKeys bool
trailingCommas bool
leadingComment string
commentStyle EncodeCommentStyle
memberComments map[string]string
memberCommentStyle EncodeCommentStyle
}
func defaultEncodeConfig() encodeConfig {
return encodeConfig{
profileID: profile.ProfileStrict,
escapeHTML: true,
validateOutput: false,
quoteStyle: EncodeQuoteDouble,
commentStyle: EncodeCommentNone,
}
}
// WithEncodeProfile selects the encode profile preset.
func WithEncodeProfile(id ProfileID) EncodeOption {
return func(c *encodeConfig) {
c.profileID = profile.ProfileID(id)
}
}
// WithEncodeEscapeHTML toggles HTML escaping for string output.
func WithEncodeEscapeHTML(enabled bool) EncodeOption {
return func(c *encodeConfig) {
c.escapeHTML = enabled
}
}
// WithEncodeValidateOutput re-parses encoded output in the selected profile and
// returns an error if invalid.
func WithEncodeValidateOutput(enabled bool) EncodeOption {
return func(c *encodeConfig) {
c.validateOutput = enabled
}
}
// WithEncodeIndent configures pretty-print indentation.
func WithEncodeIndent(prefix, indent string) EncodeOption {
return func(c *encodeConfig) {
c.indentPref = prefix
c.indentVal = indent
}
}
// WithEncodeStringQuoteStyle selects output string quote style.
func WithEncodeStringQuoteStyle(style EncodeQuoteStyle) EncodeOption {
return func(c *encodeConfig) {
c.quoteStyle = style
}
}
// WithEncodeUnquotedKeys enables JSON5 unquoted member keys when valid.
func WithEncodeUnquotedKeys(enabled bool) EncodeOption {
return func(c *encodeConfig) {
c.unquotedKeys = enabled
}
}
// WithEncodeTrailingCommas enables trailing commas in arrays and objects.
func WithEncodeTrailingCommas(enabled bool) EncodeOption {
return func(c *encodeConfig) {
c.trailingCommas = enabled
}
}
// WithEncodeLeadingComment prepends a document-level comment.
func WithEncodeLeadingComment(text string, style EncodeCommentStyle) EncodeOption {
return func(c *encodeConfig) {
c.leadingComment = text
c.commentStyle = style
}
}
// WithEncodeMemberComments injects comments before selected object member keys.
func WithEncodeMemberComments(comments map[string]string, style EncodeCommentStyle) EncodeOption {
cp := make(map[string]string, len(comments))
for k, v := range comments {
cp[k] = v
}
return func(c *encodeConfig) {
c.memberComments = cp
c.memberCommentStyle = style
}
}