|
|
|
@ -1,5 +1,8 @@
|
|
|
|
|
|
|
|
|
|
class SpecFileParser
|
|
|
|
|
class SpecParser
|
|
|
|
|
|
|
|
|
|
class Exception < ::Exception
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
macro incompatible_methods(*names)
|
|
|
|
|
{% for name in names %}
|
|
|
|
@ -40,7 +43,7 @@ class SpecFileParser
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class LongStringContainer
|
|
|
|
|
SpecFileParser.incompatible_methods as_s, as_a_or_s
|
|
|
|
|
SpecParser.incompatible_methods as_s, as_a_or_s
|
|
|
|
|
property value : String
|
|
|
|
|
|
|
|
|
|
def as_s_or_ls : String
|
|
|
|
@ -52,7 +55,7 @@ class SpecFileParser
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class ArrayContainer
|
|
|
|
|
SpecFileParser.incompatible_methods as_s, as_s_or_ls
|
|
|
|
|
SpecParser.incompatible_methods as_s, as_s_or_ls
|
|
|
|
|
property value : Array(String)
|
|
|
|
|
|
|
|
|
|
def as_a_or_s : Array(String)
|
|
|
|
@ -64,7 +67,7 @@ class SpecFileParser
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class Section
|
|
|
|
|
SpecFileParser.incompatible_methods as_s, as_a_or_s, as_s_or_ls
|
|
|
|
|
SpecParser.incompatible_methods as_s, as_a_or_s, as_s_or_ls
|
|
|
|
|
property name : String
|
|
|
|
|
property options : Array(String)
|
|
|
|
|
property content : Hash(String, StringContainer | ArrayContainer | LongStringContainer)
|
|
|
|
@ -365,30 +368,31 @@ class SpecFileParser
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# The only function to use from outside.
|
|
|
|
|
#
|
|
|
|
|
# public functions
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
def self.parse(file_name : String, options : Hash(String, String) | Nil = nil) : SpecFileParser | Nil
|
|
|
|
|
begin
|
|
|
|
|
content = File.read(file_name)
|
|
|
|
|
content = content.rchop
|
|
|
|
|
def self.parse_file(file_name : String, options : Hash(String, String) | Nil = nil) : SpecParser
|
|
|
|
|
content = File.read(file_name)
|
|
|
|
|
content = content.rchop
|
|
|
|
|
|
|
|
|
|
specs = SpecFileParser.new
|
|
|
|
|
unless options.nil?
|
|
|
|
|
options.each do |opt, val|
|
|
|
|
|
specs.assignments[opt] = StringContainer.new val
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
specs = parse content, options
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
specs.parse_lines (content.split("\n"))
|
|
|
|
|
def self.parse(data : String, options : Hash(String, String) | Nil = nil) : SpecParser
|
|
|
|
|
specs = SpecParser.new
|
|
|
|
|
unless options.nil?
|
|
|
|
|
options.each do |opt, val|
|
|
|
|
|
specs.assignments[opt] = StringContainer.new val
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
specs.rewrite
|
|
|
|
|
specs.parse_lines (data.split("\n"))
|
|
|
|
|
|
|
|
|
|
specs
|
|
|
|
|
rescue e
|
|
|
|
|
puts "Exception: #{e}"
|
|
|
|
|
specs.rewrite
|
|
|
|
|
|
|
|
|
|
nil
|
|
|
|
|
end
|
|
|
|
|
specs
|
|
|
|
|
rescue e
|
|
|
|
|
raise Exception.new "unexpected parser error: #{e}"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|