...
1 package toml
2
3 import (
4 "github.com/pelletier/go-toml/v2/internal/danger"
5 "github.com/pelletier/go-toml/v2/internal/tracker"
6 "github.com/pelletier/go-toml/v2/unstable"
7 )
8
9 type strict struct {
10 Enabled bool
11
12
13 key tracker.KeyTracker
14
15 missing []unstable.ParserError
16 }
17
18 func (s *strict) EnterTable(node *unstable.Node) {
19 if !s.Enabled {
20 return
21 }
22
23 s.key.UpdateTable(node)
24 }
25
26 func (s *strict) EnterArrayTable(node *unstable.Node) {
27 if !s.Enabled {
28 return
29 }
30
31 s.key.UpdateArrayTable(node)
32 }
33
34 func (s *strict) EnterKeyValue(node *unstable.Node) {
35 if !s.Enabled {
36 return
37 }
38
39 s.key.Push(node)
40 }
41
42 func (s *strict) ExitKeyValue(node *unstable.Node) {
43 if !s.Enabled {
44 return
45 }
46
47 s.key.Pop(node)
48 }
49
50 func (s *strict) MissingTable(node *unstable.Node) {
51 if !s.Enabled {
52 return
53 }
54
55 s.missing = append(s.missing, unstable.ParserError{
56 Highlight: keyLocation(node),
57 Message: "missing table",
58 Key: s.key.Key(),
59 })
60 }
61
62 func (s *strict) MissingField(node *unstable.Node) {
63 if !s.Enabled {
64 return
65 }
66
67 s.missing = append(s.missing, unstable.ParserError{
68 Highlight: keyLocation(node),
69 Message: "missing field",
70 Key: s.key.Key(),
71 })
72 }
73
74 func (s *strict) Error(doc []byte) error {
75 if !s.Enabled || len(s.missing) == 0 {
76 return nil
77 }
78
79 err := &StrictMissingError{
80 Errors: make([]DecodeError, 0, len(s.missing)),
81 }
82
83 for _, derr := range s.missing {
84 derr := derr
85 err.Errors = append(err.Errors, *wrapDecodeError(doc, &derr))
86 }
87
88 return err
89 }
90
91 func keyLocation(node *unstable.Node) []byte {
92 k := node.Key()
93
94 hasOne := k.Next()
95 if !hasOne {
96 panic("should not be called with empty key")
97 }
98
99 start := k.Node().Data
100 end := k.Node().Data
101
102 for k.Next() {
103 end = k.Node().Data
104 }
105
106 return danger.BytesRange(start, end)
107 }
108
View as plain text