Sha256: ecd524d916e953c684bd9cca0057ebef49fbdb2d8aa77ef97d4cc9dc829e4e06
Contents?: true
Size: 1.18 KB
Versions: 5
Compression:
Stored size: 1.18 KB
Contents
require 'date' module Monolens module Coerce class DateTime include Lens DEFAULT_FORMATS = [ nil ] signature(Type::Coercible.to(Type::String), Type::DateTime, { parser: [Type::DateTimeParser, false], formats: [Type::Array.of(Type::String), false] }) def call(arg, world = {}) return arg if arg.is_a?(::DateTime) is_string!(arg, world) date = nil first_error = nil formats = option(:formats, DEFAULT_FORMATS) formats.each do |format| begin return date = strptime(arg, format) rescue ArgumentError => ex first_error ||= ex rescue ::Date::Error => ex first_error ||= ex end end fail!("Invalid DateTime `#{arg}`", world) if first_error end private def strptime(arg, format = nil) parsed = if format.nil? parser.parse(arg) else parser.strptime(arg, format) end parsed = parsed.to_datetime if parsed.respond_to?(:to_datetime) parsed end def parser option(:parser, ::DateTime) end end end end
Version data entries
5 entries across 5 versions & 1 rubygems