annotate vendor/github.com/alecthomas/chroma/v2/serialise.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package chroma
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "compress/gzip"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "encoding/xml"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "errors"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "io"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 "io/fs"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 "path/filepath"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "reflect"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "regexp"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 // Serialisation of Chroma rules to XML. The format is:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 // <rules>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 // <state name="$STATE">
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 // <rule [pattern="$PATTERN"]>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 // [<$EMITTER ...>]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 // [<$MUTATOR ...>]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 // </rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 // </state>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 // </rules>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 // eg. Include("String") would become:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // <rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 // <include state="String" />
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 // </rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 // [null, null, {"kind": "include", "state": "String"}]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 // eg. Rule{`\d+`, Text, nil} would become:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 // <rule pattern="\\d+">
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 // <token type="Text"/>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 // </rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 // eg. Rule{`"`, String, Push("String")}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 // <rule pattern="\"">
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 // <token type="String" />
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 // <push state="String" />
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 // </rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 // eg. Rule{`(\w+)(\n)`, ByGroups(Keyword, Whitespace), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 // <rule pattern="(\\w+)(\\n)">
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 // <bygroups token="Keyword" token="Whitespace" />
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 // <push state="String" />
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // </rule>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 // ErrNotSerialisable is returned if a lexer contains Rules that cannot be serialised.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 ErrNotSerialisable = fmt.Errorf("not serialisable")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 emitterTemplates = func() map[string]SerialisableEmitter {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 out := map[string]SerialisableEmitter{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 for _, emitter := range []SerialisableEmitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 &byGroupsEmitter{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 &usingSelfEmitter{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 TokenType(0),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 &usingEmitter{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 &usingByGroup{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 } {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 out[emitter.EmitterKind()] = emitter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 return out
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 }()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 mutatorTemplates = func() map[string]SerialisableMutator {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 out := map[string]SerialisableMutator{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 for _, mutator := range []SerialisableMutator{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 &includeMutator{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 &combinedMutator{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 &multiMutator{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 &pushMutator{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 &popMutator{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 } {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 out[mutator.MutatorKind()] = mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 return out
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 }()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 // fastUnmarshalConfig unmarshals only the Config from a serialised lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 func fastUnmarshalConfig(from fs.FS, path string) (*Config, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 r, err := from.Open(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 defer r.Close()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 dec := xml.NewDecoder(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 token, err := dec.Token()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 if errors.Is(err, io.EOF) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 return nil, fmt.Errorf("could not find <config> element")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 switch se := token.(type) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 case xml.StartElement:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 if se.Name.Local != "config" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 var config Config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 err = dec.DecodeElement(&config, &se)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 return &config, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 // MustNewXMLLexer constructs a new RegexLexer from an XML file or panics.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 func MustNewXMLLexer(from fs.FS, path string) *RegexLexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 lex, err := NewXMLLexer(from, path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 return lex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 // NewXMLLexer creates a new RegexLexer from a serialised RegexLexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 func NewXMLLexer(from fs.FS, path string) (*RegexLexer, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 config, err := fastUnmarshalConfig(from, path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 for _, glob := range append(config.Filenames, config.AliasFilenames...) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 _, err := filepath.Match(glob, "")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 return nil, fmt.Errorf("%s: %q is not a valid glob: %w", config.Name, glob, err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 return &RegexLexer{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 config: config,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 fetchRulesFunc: func() (Rules, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 var lexer struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 Config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 Rules Rules `xml:"rules"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 // Try to open .xml fallback to .xml.gz
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 fr, err := from.Open(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 if errors.Is(err, fs.ErrNotExist) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 path += ".gz"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 fr, err = from.Open(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 defer fr.Close()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 var r io.Reader = fr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 if strings.HasSuffix(path, ".gz") {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 r, err = gzip.NewReader(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 return nil, fmt.Errorf("%s: %w", path, err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 err = xml.NewDecoder(r).Decode(&lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 return nil, fmt.Errorf("%s: %w", path, err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 return lexer.Rules, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 }, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 // Marshal a RegexLexer to XML.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 func Marshal(l *RegexLexer) ([]byte, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 type lexer struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 Config Config `xml:"config"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 Rules Rules `xml:"rules"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 rules, err := l.Rules()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 root := &lexer{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 Config: *l.Config(),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 Rules: rules,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 data, err := xml.MarshalIndent(root, "", " ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 re := regexp.MustCompile(`></[a-zA-Z]+>`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 data = re.ReplaceAll(data, []byte(`/>`))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 return data, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 // Unmarshal a RegexLexer from XML.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 func Unmarshal(data []byte) (*RegexLexer, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 type lexer struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 Config Config `xml:"config"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 Rules Rules `xml:"rules"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 root := &lexer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 err := xml.Unmarshal(data, root)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 return nil, fmt.Errorf("invalid Lexer XML: %w", err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 lex, err := NewLexer(&root.Config, func() Rules { return root.Rules })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 return lex, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 func marshalMutator(e *xml.Encoder, mutator Mutator) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 if mutator == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 smutator, ok := mutator.(SerialisableMutator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 return fmt.Errorf("unsupported mutator: %w", ErrNotSerialisable)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 return e.EncodeElement(mutator, xml.StartElement{Name: xml.Name{Local: smutator.MutatorKind()}})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 func unmarshalMutator(d *xml.Decoder, start xml.StartElement) (Mutator, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 kind := start.Name.Local
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 mutator, ok := mutatorTemplates[kind]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 return nil, fmt.Errorf("unknown mutator %q: %w", kind, ErrNotSerialisable)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 value, target := newFromTemplate(mutator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 if err := d.DecodeElement(target, &start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 return value().(SerialisableMutator), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 func marshalEmitter(e *xml.Encoder, emitter Emitter) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 if emitter == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 semitter, ok := emitter.(SerialisableEmitter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 return fmt.Errorf("unsupported emitter %T: %w", emitter, ErrNotSerialisable)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 return e.EncodeElement(emitter, xml.StartElement{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 Name: xml.Name{Local: semitter.EmitterKind()},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 func unmarshalEmitter(d *xml.Decoder, start xml.StartElement) (Emitter, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 kind := start.Name.Local
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 mutator, ok := emitterTemplates[kind]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 return nil, fmt.Errorf("unknown emitter %q: %w", kind, ErrNotSerialisable)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 value, target := newFromTemplate(mutator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 if err := d.DecodeElement(target, &start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 return value().(SerialisableEmitter), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 func (r Rule) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 start := xml.StartElement{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 Name: xml.Name{Local: "rule"},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 if r.Pattern != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 start.Attr = append(start.Attr, xml.Attr{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 Name: xml.Name{Local: "pattern"},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 Value: r.Pattern,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 if err := e.EncodeToken(start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 if err := marshalEmitter(e, r.Type); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 if err := marshalMutator(e, r.Mutator); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 return e.EncodeToken(xml.EndElement{Name: start.Name})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 func (r *Rule) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 for _, attr := range start.Attr {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 if attr.Name.Local == "pattern" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 r.Pattern = attr.Value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297 token, err := d.Token()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 switch token := token.(type) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 case xml.StartElement:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 mutator, err := unmarshalMutator(d, token)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 if err != nil && !errors.Is(err, ErrNotSerialisable) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 } else if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 if r.Mutator != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 return fmt.Errorf("duplicate mutator")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 r.Mutator = mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 emitter, err := unmarshalEmitter(d, token)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 if err != nil && !errors.Is(err, ErrNotSerialisable) { // nolint: gocritic
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 } else if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 if r.Type != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 return fmt.Errorf("duplicate emitter")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 r.Type = emitter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 case xml.EndElement:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 type xmlRuleState struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 Name string `xml:"name,attr"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 Rules []Rule `xml:"rule"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 type xmlRules struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 States []xmlRuleState `xml:"state"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 func (r Rules) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 xr := xmlRules{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 for state, rules := range r {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 xr.States = append(xr.States, xmlRuleState{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 Name: state,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346 Rules: rules,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 return e.EncodeElement(xr, xml.StartElement{Name: xml.Name{Local: "rules"}})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 func (r *Rules) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 xr := xmlRules{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 if err := d.DecodeElement(&xr, &start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357 if *r == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 *r = Rules{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 for _, state := range xr.States {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 (*r)[state.Name] = state.Rules
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366 type xmlTokenType struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 Type string `xml:"type,attr"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370 func (t *TokenType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 el := xmlTokenType{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 if err := d.DecodeElement(&el, &start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 for tt, text := range _TokenType_map {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 if text == el.Type {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 *t = tt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 return fmt.Errorf("unknown TokenType %q", el.Type)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 func (t TokenType) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 start.Attr = append(start.Attr, xml.Attr{Name: xml.Name{Local: "type"}, Value: t.String()})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 if err := e.EncodeToken(start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389 return e.EncodeToken(xml.EndElement{Name: start.Name})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392 // This hijinks is a bit unfortunate but without it we can't deserialise into TokenType.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 func newFromTemplate(template interface{}) (value func() interface{}, target interface{}) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 t := reflect.TypeOf(template)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395 if t.Kind() == reflect.Ptr {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396 v := reflect.New(t.Elem())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 return v.Interface, v.Interface()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 v := reflect.New(t)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 return func() interface{} { return v.Elem().Interface() }, v.Interface()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 func (b *Emitters) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 token, err := d.Token()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409 switch token := token.(type) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 case xml.StartElement:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 emitter, err := unmarshalEmitter(d, token)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 *b = append(*b, emitter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 case xml.EndElement:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 func (b Emitters) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424 if err := e.EncodeToken(start); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 for _, m := range b {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428 if err := marshalEmitter(e, m); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 return e.EncodeToken(xml.EndElement{Name: start.Name})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433 }