summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2021-05-09 13:38:11 -0600
committermo khan <mo@mokhan.ca>2021-05-09 13:38:11 -0600
commit1858fd10cb0989ea9155f13ba761c36cd92963cc (patch)
tree4384f1514ede51e696f50ced7a73e8930e450623 /lib
parent10c6d265a3bb0bbe0aa9169f6ecd47abd7d1f5ab (diff)
[wip] parse arguments
Diffstat (limited to 'lib')
-rw-r--r--lib/spandx/terraform/parsers/hcl.rb58
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