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

Version Path
monolens-0.6.4 lib/monolens/stdlib/coerce/date_time.rb
monolens-0.6.3 lib/monolens/stdlib/coerce/date_time.rb
monolens-0.6.2 lib/monolens/stdlib/coerce/date_time.rb
monolens-0.6.1 lib/monolens/stdlib/coerce/date_time.rb
monolens-0.6.0 lib/monolens/stdlib/coerce/date_time.rb