Sha256: 338ae6ca193655516c6d43bf0404e3a8b522cb2093697f480b45cca026af07ec

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

module Structural
  module Model
    module TypeCasts
      def self.cast(type, value)
        casts.fetch(type, Identity).new(value).cast
      end

      protected

      def self.register(cast)
        casts[cast.type] = cast
      end

      private

      def self.casts
        @casts ||= {}
      end

      class Cast
        def initialize(value)
          @value = value
        end

        def cast
          value.is_a?(type) ? value : conversion
        end

        def type
          self.class.type
        end

        def conversion
          raise NotImplementedError
        end

        private

        def self.type
          raise NotImplementedError
        end

        attr_reader :value
      end

      class Identity < Cast
        def cast
          value
        end
      end

      class Integer < Cast
        def self.type
          ::Integer
        end

        def conversion
          value.to_i
        end

        TypeCasts.register(self)
      end

      class Date < Cast
        def self.type
          ::Date
        end

        def conversion
          ::Date.parse value
        end

        TypeCasts.register(self)
      end

      class Time < Cast
        def self.type
          ::Time
        end

        def conversion
          ::Time.parse value
        end

        TypeCasts.register(self)
      end

      class Money < Cast
        def self.type
          ::Money
        end

        def conversion
          ::Money.new value.to_i
        end

        TypeCasts.register(self)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
structural-0.0.2 lib/structural/model/type_casts.rb