class Fossyl::Parser

Attributes

scanner[R]

Public Class Methods

new(string) click to toggle source
# File lib/fossyl/parser.rb, line 6
def initialize(string)
  @scanner = StringScanner.new(string)
end

Public Instance Methods

parse() click to toggle source
# File lib/fossyl/parser.rb, line 10
def parse
  return parse_bytes      if scanner.scan(/\d+/)
  return parse_integer    if scanner.scan(/i/)
  return parse_list       if scanner.scan(/l/)
  return parse_dictionary if scanner.scan(/d/)

  raise Fossyl::InvalidBencoding
end

Private Instance Methods

parse_bytes() click to toggle source
# File lib/fossyl/parser.rb, line 20
def parse_bytes
  length = scanner.matched.to_i
  scanner.get_byte # Skip the ':'
  length.times.map { scanner.get_byte }.join
end
parse_dictionary() click to toggle source
# File lib/fossyl/parser.rb, line 36
def parse_dictionary
  hash = {}
  hash[parse] = parse until scanner.scan(/e/)
  hash
end
parse_integer() click to toggle source
# File lib/fossyl/parser.rb, line 26
def parse_integer
  scanner.scan_until(/e/).chop.to_i
end
parse_list() click to toggle source
# File lib/fossyl/parser.rb, line 30
def parse_list
  list = []
  list << parse until scanner.scan(/e/)
  list
end