35 lines
697 B
Ruby
35 lines
697 B
Ruby
# frozen_string_literal: true
|
|
|
|
require 'abbrev'
|
|
|
|
module DurationParser
|
|
def self.parse(string)
|
|
abbrevs = Abbrev.abbrev(%w[seconds minutes hours days weeks months years])
|
|
|
|
raise unless string =~ /(.*?)([a-z]+)\z/i
|
|
size = Float($1)
|
|
unit = abbrevs.fetch($2.downcase)
|
|
|
|
case unit
|
|
when "seconds"
|
|
size.seconds
|
|
when "minutes"
|
|
size.minutes
|
|
when "hours"
|
|
size.hours
|
|
when "days"
|
|
size.days
|
|
when "weeks"
|
|
size.weeks
|
|
when "months"
|
|
size * (365.25.days / 12)
|
|
when "years"
|
|
size * (365.25.days)
|
|
else
|
|
raise NotImplementedError
|
|
end
|
|
rescue
|
|
raise ArgumentError, "'#{string}' is not a valid duration"
|
|
end
|
|
end
|