diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/spandx/terraform/parsers/hcl.rb | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/lib/spandx/terraform/parsers/hcl.rb b/lib/spandx/terraform/parsers/hcl.rb index 0a2b99f..5788ab0 100644 --- a/lib/spandx/terraform/parsers/hcl.rb +++ b/lib/spandx/terraform/parsers/hcl.rb @@ -4,24 +4,28 @@ module Spandx module Terraform module Parsers class Hcl < Parslet::Parser - rule(:anything) { match('.').repeat } rule(:alpha) { match['a-zA-Z'] } rule(:assign) { str('=') } rule(:crlf) { match('[\r\n]') } rule(:digit) { match('\d') } rule(:dot) { str('.') } rule(:eol) { whitespace? >> crlf.repeat } + rule(:hyphen) { str('-') } rule(:lcurly) { str('{') } + rule(:major) { number } + rule(:major_minor) { (number >> dot >> number) } + rule(:major_minor_patch) { number >> dot >> number >> dot >> number } rule(:number) { digit.repeat } + rule(:pre_release) { hyphen >> (alpha | digit).repeat } + rule(:pre_release?) { pre_release.maybe } rule(:quote) { str('"') } rule(:rcurly) { str('}') } rule(:space) { match('\s') } - rule(:pre_release) { hyphen >> (alpha | digit).repeat } - rule(:pre_release?) { pre_release.maybe } + rule(:tilda_wacka) { str("~>") } rule(:version) { number >> dot >> number >> dot >> number >> pre_release? } rule(:whitespace) { space.repeat } rule(:whitespace?) { whitespace.maybe } - rule(:hyphen) { str('-') } + rule(:greater_than_or_equal_to) { str('>=') } rule :attribute_name do alpha.repeat @@ -35,29 +39,55 @@ module Spandx match('[0-9A-Za-z.~> ]') end + rule(:version_constraint) do + pessimistic_version_constraint | greater_than_or_equal_to_version + end + rule :version_assignment do - whitespace? >> str('version') >> whitespace >> assign >> whitespace >> quote >> version.as(:version) >> quote + str('version') >> whitespace >> assign >> whitespace >> quote >> version.as(:version) >> quote + end + + rule :constraint_assignment do + str("constraints") >> whitespace >> assign >> whitespace >> quote >> version_constraint.as(:constraints) >> quote + end + + rule(:pessimistic_version_constraint) do + tilda_wacka >> whitespace >> ( + major_minor_patch | + major_minor | + major + ) end - rule :constraints do - anything + rule(:greater_than_or_equal_to_version) do + greater_than_or_equal_to >> whitespace >> ( + major_minor_patch | + major_minor | + major + ) end - rule :hashes do - anything + rule :argument do + ( + str('version') | + str('constraints') + ).as(:argument) >> whitespace >> assign >> whitespace >> quote >> ( + version | + version_constraint + ).as(:value) >> quote end - rule :assignments do - # (version_assignment | constraints | hashes).repeat - version_assignment >> eol + rule :arguments do + #((version_assignment | constraint_assignment) >> eol).repeat + (argument >> eol).repeat end rule :block do - whitespace >> lcurly >> eol >> assignments >> rcurly >> eol + whitespace >> lcurly >> eol >> arguments >> rcurly >> eol end rule :identifier do - whitespace >> quote >> match('[a-zA-Z./]').repeat.as(:name) >> quote >> whitespace + whitespace >> quote >> ((alpha | match('[./]')).repeat).as(:name) >> quote >> whitespace end rule :provider do |
