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  }