github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/azure/arm/parser/armjson/parse_object.go (about) 1 package armjson 2 3 import ( 4 "github.com/khulnasoft-lab/defsec/pkg/types" 5 ) 6 7 func (p *parser) parseObject(parentMetadata *types.Metadata) (Node, error) { 8 9 n, metadata := p.newNode(KindObject, parentMetadata) 10 11 c, err := p.next() 12 if err != nil { 13 return nil, err 14 } 15 16 if c != '{' { 17 return nil, p.makeError("expecting object delimiter") 18 } 19 20 if err := p.parseWhitespace(); err != nil { 21 return nil, err 22 } 23 24 // we've hit the end of the object 25 if p.swallowIfEqual('}') { 26 n.end = p.position 27 return n, nil 28 } 29 30 var nextComments []Node 31 return p.iterateObject(nextComments, metadata, n) 32 33 } 34 35 // nolint: cyclop 36 func (p *parser) iterateObject(nextComments []Node, metadata *types.Metadata, n *node) (Node, error) { 37 for { 38 39 if err := p.parseWhitespace(); err != nil { 40 return nil, err 41 } 42 43 comments := make([]Node, len(nextComments)) 44 copy(comments, nextComments) 45 nextComments = nil 46 for { 47 peeked, err := p.peeker.Peek() 48 if err != nil { 49 return nil, err 50 } 51 if peeked != '/' { 52 break 53 } 54 comment, err := p.parseComment(metadata) 55 if err != nil { 56 return nil, err 57 } 58 comments = append(comments, comment) 59 } 60 61 if comments != nil { 62 if err := p.parseWhitespace(); err != nil { 63 return nil, err 64 } 65 } 66 67 key, err := p.parseString(metadata) 68 if err != nil { 69 return nil, err 70 } 71 72 if err := p.parseWhitespace(); err != nil { 73 return nil, err 74 } 75 76 if !p.swallowIfEqual(':') { 77 return nil, p.makeError("invalid character, expecting ':'") 78 } 79 80 val, err := p.parseElement(metadata) 81 if err != nil { 82 return nil, err 83 } 84 ref := key.(*node).raw.(string) 85 key.(*node).ref = ref 86 val.(*node).ref = ref 87 88 for { 89 peeked, err := p.peeker.Peek() 90 if err != nil { 91 return nil, err 92 } 93 if peeked != '/' { 94 break 95 } 96 comment, err := p.parseComment(metadata) 97 if err != nil { 98 return nil, err 99 } 100 comments = append(comments, comment) 101 } 102 103 // we've hit the end of the object 104 if p.swallowIfEqual('}') { 105 key.(*node).comments = comments 106 val.(*node).comments = comments 107 n.content = append(n.content, key, val) 108 n.end = p.position 109 return n, nil 110 } 111 112 if !p.swallowIfEqual(',') { 113 return nil, p.makeError("unexpected character - expecting , or }") 114 } 115 116 for { 117 if err := p.parseWhitespace(); err != nil { 118 return nil, err 119 } 120 peeked, err := p.peeker.Peek() 121 if err != nil { 122 return nil, err 123 } 124 if peeked != '/' { 125 break 126 } 127 comment, err := p.parseComment(metadata) 128 if err != nil { 129 return nil, err 130 } 131 if comment.Range().Start.Line > val.Range().End.Line { 132 nextComments = append(nextComments, comment) 133 } else { 134 comments = append(comments, comment) 135 } 136 } 137 138 key.(*node).comments = comments 139 val.(*node).comments = comments 140 n.content = append(n.content, key, val) 141 142 } 143 }