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

[](name)
Alias for: lookup
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