lib/munson/attribute.rb
module Munson
class Attribute
attr_reader :name
attr_reader :cast_type
attr_reader :options
def initialize(name, cast_type, options={})
options[:default] ||= nil
options[:array] ||= false
@name = name
@cast_type = cast_type
@options = options
end
# Process a raw JSON value
def process(value)
value.nil? ? default_value : cast(value)
end
# Super naive casting!
def cast(value)
return (@options[:array] ? [] : nil) if value.nil?
value.is_a?(Array) ?
value.map { |v| cast_value(v) } :
cast_value(value)
end
def cast_value(value)
return nil if value.nil?
case cast_type
when Proc
cast_type.call(value)
when :string, :to_s, String
value.to_s
when :integer, :to_i, Fixnum
value.to_i
when :bigdecimal
BigDecimal.new(value.to_s)
when :float, :to_f, Float
value.to_f
when :date, Date
Date.parse(value) rescue nil
when :time, Time
Time.parse(value) rescue nil
else
value
end
end
# Serializes the value back to JSON datatype
#
def serialize(value)
case options[:serialize]
when Proc
options[:serialize].call(value)
when Symbol
value.send(options[:serialize])
else
value
end
end
def default_value
case @options[:default]
when Proc
@options[:default].call
when nil
@options[:array] ? [] : nil
else
@options[:default].clone
end
end
end
end