class Envo::ScriptParser
Public Class Methods
new(opts)
click to toggle source
# File lib/envo/script_parser.rb, line 5 def initialize(opts) @known_cmds = {} @known_opts = opts end
Public Instance Methods
add_cmd(name, parse_func)
click to toggle source
# File lib/envo/script_parser.rb, line 9 def add_cmd(name, parse_func) raise Envo::Error "cmd #{name} is already added to parser" if @known_cmds[name] @known_cmds[name] = parse_func end
parse(lines)
click to toggle source
# File lib/envo/script_parser.rb, line 13 def parse(lines) result = ParseResult.new lines.each_with_index do |line, li| li += 1 line.strip! next if line.empty? next if line[0] == '#' # comment line_opts = if line[0] == '{' # opts pack i = line.index('}') raise Envo::Error.new "#{li}: malformed options pack" if !i opts = line[1...i].split(',') line = line[i+1..] opts else [] end raise Envo::Error.new "#{li}: missing command" if line.empty? tokens = [] begin tokens = CSV::parse_line(line, col_sep: ' ').compact rescue puts "AAAAAAA: #{line.inspect}" raise Envo::Error.new "#{li}: malformed line" end raise Envo::Error.new "#{li}: missing command" if tokens.empty? cmd = tokens.shift raise Envo::Error.new "#{li}: unknown command '#{cmd}'" if !@known_cmds[cmd] parsed_cmd = @known_cmds[cmd].(cmd, tokens, line_opts) cmd_opts = {} parsed_cmd.opts.each do |opt| cmd_opts.merge! @known_opts.parse_script(opt) end parsed_cmd.opts = cmd_opts result.cmds << parsed_cmd end result end