strict.go (1805B)
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 // Tracks the current key being processed. 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 }