class Tomlrb::Scanner

Constants

COMMENT
DATETIME
FALSE
FLOAT
IDENTIFIER
INTEGER
SPACE
STRING_BASIC
STRING_LITERAL
STRING_LITERAL_MULTI
STRING_MULTI
TRUE

Public Class Methods

new(io) click to toggle source
# File lib/tomlrb/scanner.rb, line 18
def initialize(io)
  @ss = StringScanner.new(io.read)
end

Public Instance Methods

next_token() click to toggle source
# File lib/tomlrb/scanner.rb, line 22
def next_token
  return if @ss.eos?

  case
  when @ss.scan(SPACE) then next_token
  when @ss.scan(COMMENT) then next_token
  when @ss.scan(DATETIME) then process_datetime
  when text = @ss.scan(STRING_MULTI) then [:STRING_MULTI, text[3..-4]]
  when text = @ss.scan(STRING_BASIC) then [:STRING_BASIC, text[1..-2]]
  when text = @ss.scan(STRING_LITERAL_MULTI) then [:STRING_LITERAL_MULTI, text[3..-4]]
  when text = @ss.scan(STRING_LITERAL) then [:STRING_LITERAL, text[1..-2]]
  when text = @ss.scan(FLOAT) then [:FLOAT, text]
  when text = @ss.scan(INTEGER) then [:INTEGER, text]
  when text = @ss.scan(TRUE)   then [:TRUE, text]
  when text = @ss.scan(FALSE)  then [:FALSE, text]
  when text = @ss.scan(IDENTIFIER) then [:IDENTIFIER, text]
  else
    x = @ss.getch
    [x, x]
  end
end
process_datetime() click to toggle source
# File lib/tomlrb/scanner.rb, line 44
def process_datetime
  if @ss[7].nil?
    offset = '+00:00'
  else
    offset = @ss[7].gsub('Z', '+00:00')
  end
  args = [@ss[1], @ss[2], @ss[3], @ss[4] || 0, @ss[5] || 0, @ss[6].to_f, offset]
  [:DATETIME, args]
end