Sha256: bfd5570e5e5185f4104f975f08a73696179fe8c7de247a32c53697f77c1f7d09

Contents?: true

Size: 1.2 KB

Versions: 14

Compression:

Stored size: 1.2 KB

Contents

require 'ardm/property/object'
require 'ardm/property/support/flags'

module Ardm
  class Property
    class Enum < Object
      include Flags

      load_as ::Object
      dump_as ::Integer

      def initialize(model, name, options = {})
        @flag_map = {}

        flags = options.fetch(:flags, self.class.flags)
        flags.each_with_index do |flag, i|
          @flag_map[i + 1] = flag
        end

        if self.class.accepted_options.include?(:set) && !options.include?(:set)
          options[:set] = @flag_map.values_at(*@flag_map.keys.sort)
        end

        super
      end

      def load(value)
        flag_map[value.to_i]
      end

      def dump(value)
        case value
        when ::Array then value.collect { |v| dump(v) }
        else              flag_map.invert[typecast(value)]
        end
      end

      def typecast(value)
        return if value.nil?
        # Attempt to typecast using the class of the first item in the map.
        case flag_map[1]
        when ::Symbol then value.to_sym
        when ::String then value.to_s
        when ::Fixnum then value.to_i
        else               value
        end
      end

    end # class Enum
  end # class Property
end # module Ardm

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
ardm-0.4.0 lib/ardm/property/enum.rb
ardm-0.3.2 lib/ardm/property/enum.rb
ardm-0.3.1 lib/ardm/property/enum.rb
ardm-0.3.0 lib/ardm/property/enum.rb
ardm-0.2.7 lib/ardm/property/enum.rb
ardm-0.2.6 lib/ardm/property/enum.rb
ardm-0.2.5 lib/ardm/property/enum.rb
ardm-0.2.4 lib/ardm/property/enum.rb
ardm-0.2.3 lib/ardm/property/enum.rb
ardm-0.2.2 lib/ardm/property/enum.rb
ardm-0.2.1 lib/ardm/property/enum.rb
ardm-0.2.0 lib/ardm/property/enum.rb
ardm-0.1.0 lib/ardm/property/enum.rb
ardm-0.0.1 lib/ardm/property/enum.rb