class TimeInputs::Parser

Public Class Methods

new(error_policy=->(message){ raise BaseError, message) click to toggle source
# File lib/time_inputs/parser.rb, line 3
def initialize error_policy=->(message){ raise BaseError, message }
  @error_policy = error_policy
end

Public Instance Methods

parse(input_string, options={}) click to toggle source
# File lib/time_inputs/parser.rb, line 7
def parse input_string, options={}
  input_as_hh_mm = to_hh_mm(input_string.to_s)
  date_context = check_date! options.fetch(:date_context) { Date.today }
  hours, minutes = input_as_hh_mm.split(":")
  Time.local(date_context.year, date_context.month, date_context.day, hours.to_i, minutes.to_i)
rescue BaseError => e
  @error_policy.call(e.message)
end

Private Instance Methods

check_date!(date) click to toggle source
# File lib/time_inputs/parser.rb, line 24
def check_date! date
  raise BaseError, "invalid date_context" unless date.respond_to?(:to_date)
  date.to_date
end
to_hh_mm(input) click to toggle source
# File lib/time_inputs/parser.rb, line 17
def to_hh_mm input
  raise BaseError, "invalid input" unless input =~ /\A\d{1,2}:?\d{2}\z/
  input.rjust(4,'0').tap do |str|
    str.insert(2,':') unless str =~/\A\d?\d:\d{2}\z/
  end
end