module Logfmt
Constants
- EQUAL
- GARBAGE
- IVALUE
- KEY
- QVALUE
- VERSION
Public Class Methods
integer?(s)
click to toggle source
# File lib/logfmt/parser.rb, line 12 def self.integer?(s) s.is_a?(Integer) || s.to_s.match(/\A[-+]?[0-9]+\Z/) end
numeric?(s)
click to toggle source
# File lib/logfmt/parser.rb, line 8 def self.numeric?(s) s.is_a?(Numeric) || s.to_s.match(/\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\Z/) end
parse(line)
click to toggle source
# File lib/logfmt/parser.rb, line 16 def self.parse(line) output = {} key, value = '', '' escaped = false state = GARBAGE i = 0 line.each_char do |c| i += 1 if state == GARBAGE if c > ' ' && c != '"' && c != '=' key = c state = KEY end next end if state == KEY if c > ' ' && c != '"' && c != '=' state = KEY key << c elsif c == '=' output[key.strip] = true state = EQUAL else output[key.strip] = true state = GARBAGE end output[key.strip] = true if i >= line.length next end if state == EQUAL if c > ' ' && c != '"' && c != '=' value = c state = IVALUE elsif c == '"' value = '' escaped = false state = QVALUE else state = GARBAGE end if i >= line.length if integer?(value) value = value.to_i elsif numeric?(value) fvalue = value.to_f value = fvalue if fvalue.finite? end output[key.strip] = value || true end next end if state == IVALUE if !(c > ' ' && c != '"') if integer?(value) value = value.to_i elsif numeric?(value) fvalue = value.to_f value = fvalue if fvalue.finite? end output[key.strip] = value state = GARBAGE else value << c end if i >= line.length if integer?(value) value = value.to_i elsif numeric?(value) fvalue = value.to_f value = fvalue if fvalue.finite? end output[key.strip] = value end next end if state == QVALUE if c == '\\' escaped = true value << '\\' elsif c == '"' if escaped escaped = false value.chop! << c next end output[key.strip] = value state = GARBAGE else escaped = false value << c end next end end output end