diff options
| author | mo khan <mo@mokhan.ca> | 2021-05-20 13:13:36 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2021-05-20 13:13:36 -0600 |
| commit | 9a7b1c1db7903fb9adeb8b2d147ec1d6d79d3505 (patch) | |
| tree | b87ead706693d57650c0501239ee9593041ac9b2 /lib | |
| parent | 2b5437f4cf12d48386d9c8ac63343598ffdad2c2 (diff) | |
feat: parse multiple provider blocks
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/spandx/terraform/parsers/hcl.rb | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/lib/spandx/terraform/parsers/hcl.rb b/lib/spandx/terraform/parsers/hcl.rb index 6e170fd..68ab244 100644 --- a/lib/spandx/terraform/parsers/hcl.rb +++ b/lib/spandx/terraform/parsers/hcl.rb @@ -6,6 +6,7 @@ module Spandx class Hcl < Parslet::Parser rule(:alpha) { match['a-zA-Z'] } rule(:assign) { str('=') } + rule(:colon) { str(':') } rule(:comma) { str(',') } rule(:comment) { (str('#') | str('//')) >> ((str("\n") >> str("\r").maybe).absent? >> any).repeat >> eol } rule(:crlf) { match('[\r\n]') } @@ -21,11 +22,13 @@ module Spandx rule(:major_minor_patch) { number >> dot >> number >> dot >> number } rule(:multiline_comment) { str('/*') >> (str('*/').absent? >> any).repeat >> str('*/') } rule(:number) { digit.repeat } + rule(:plus) { str('+') } rule(:pre_release) { hyphen >> (alpha | digit).repeat } rule(:pre_release?) { pre_release.maybe } rule(:quote) { str('"') } rule(:rbracket) { str(']') } rule(:rcurly) { str('}') } + rule(:slash) { str('/') } rule(:space) { match('\s') } rule(:tilda_wacka) { str('~>') } rule(:version) { number >> dot >> number >> dot >> number >> pre_release? } @@ -61,39 +64,41 @@ module Spandx end rule :string do - quote >> match('[0-9A-Za-z.~> :=/]').repeat.as(:value) >> quote + quote >> ( + digit | dot | alpha | str('~> ') | slash | colon | assign | plus + ).repeat(1).as(:value) >> quote end rule :array_item do - whitespace >> string >> comma >> eol + whitespace? >> string >> comma.maybe >> eol end rule :array do - lbracket >> eol >> array_item.repeat >> rbracket + lbracket >> eol >> array_item.repeat >> whitespace >> rbracket end - rule :argument do - alpha.repeat.as(:name) >> whitespace >> assign >> whitespace >> (array.as(:values) | string) + rule :argument_value do + (array.as(:values) | string) >> eol end - rule :arguments do - (argument >> eol).repeat + rule :argument do + whitespace >> alpha.repeat(1).as(:name) >> whitespace >> assign >> whitespace >> argument_value end - rule :identifier do - whitespace >> quote >> ((alpha | match('[./]')).repeat).as(:name) >> quote >> whitespace + rule :block_body do + lcurly >> crlf >> argument.repeat.as(:arguments) >> rcurly end - rule :block_body do - arguments.as(:arguments) + rule :identifier do + whitespace >> quote >> (alpha | dot | slash).repeat(1).as(:name) >> quote >> whitespace end rule :block do - whitespace? >> (alpha.repeat).as(:type) >> identifier >> whitespace >> lcurly >> eol >> block_body >> rcurly >> eol + alpha.repeat(1).as(:type) >> identifier >> block_body end rule :blocks do - block.repeat.as(:blocks) + whitespace? >> (block >> eol.maybe).repeat(1).as(:blocks) end root(:blocks) |
