class DumpParser
Implements a really dump value 2 value parser DSL
Constants
- DEFAULT_MAP_BLOCK
Attributes
name[R]
value[R]
Public Class Methods
new(name,map=nil,block=nil)
click to toggle source
# File lib/dump-parser.rb, line 10 def initialize(name,map=nil,block=nil) unless block || map raise ArgumentError,'need map block or both' end block ||= DEFAULT_MAP_BLOCK @name,@map,@block = name,map,block end
Protected Class Methods
execute(name,value)
click to toggle source
# File lib/dump-parser.rb, line 105 def execute(name,value) parser = lookup name parser.execute(value) end
has_parser?(name)
click to toggle source
# File lib/dump-parser.rb, line 126 def has_parser?(name) registry.key? name.to_s end
lookup(name)
click to toggle source
# File lib/dump-parser.rb, line 119 def lookup(name) name = name.to_s registry[name] || raise(ArgumentError,"a parser named #{name.inspect} is not registred") end
Also aliased as: []
names()
click to toggle source
# File lib/dump-parser.rb, line 134 def names registry.keys end
register(name,map=nil,&block)
click to toggle source
# File lib/dump-parser.rb, line 110 def register(name,map=nil,&block) name = name.to_s if has_parser? name raise ArgumentError,"a parser named #{name.inspect} is already registred" end parser = self.new(name,map,block) registry[name]=parser end
registry()
click to toggle source
# File lib/dump-parser.rb, line 140 def registry @registry ||= {} end
reset!()
click to toggle source
# File lib/dump-parser.rb, line 130 def reset! @registry = nil end
Public Instance Methods
execute(value)
click to toggle source
# File lib/dump-parser.rb, line 20 def execute(value) unless value.kind_of? String raise ArgumentError.new("#{name}: parse input \"#{value.inspect}\" must be kind of String") end @value = value begin catch :done do @result = instance_eval(&@block) end returning @result do @result = nil end ensure reset! end end
Protected Instance Methods
error_if_empty()
click to toggle source
# File lib/dump-parser.rb, line 53 def error_if_empty value = self.value if value.empty? parse_error 'must not be empty' else value end end
fetch_map()
click to toggle source
# File lib/dump-parser.rb, line 89 def fetch_map map,value = self.map,self.value unless map.key? value parse_error('is not valid') else map.fetch value end end
map()
click to toggle source
# File lib/dump-parser.rb, line 80 def map @map || raise(RuntimeError,'this parser does not have a map') end
match()
click to toggle source
# File lib/dump-parser.rb, line 72 def match @last_match || raise(RuntimeError,'no current match available') end
nil_if_empty()
click to toggle source
# File lib/dump-parser.rb, line 43 def nil_if_empty value = self.value if value.empty? @result = nil throw :done else value end end
parse_error(message)
click to toggle source
# File lib/dump-parser.rb, line 99 def parse_error(message) raise ParseError.new("#{name}: value #{value.inspect} #{message}") end
require_format(format)
click to toggle source
# File lib/dump-parser.rb, line 62 def require_format(format) value = self.value @last_match = format.match value if @last_match value else parse_error 'does not match required format' end end
reset!()
click to toggle source
# File lib/dump-parser.rb, line 76 def reset! @value = @result = @match = nil end
returning(value) { || ... }
click to toggle source
# File lib/dump-parser.rb, line 84 def returning(value) yield value end