Sha256: 873260d33c8a6172026e5c00648a1a3d618696c6b9c59ef358a4eb1e0bd0aae1

Contents?: true

Size: 1.56 KB

Versions: 4

Compression:

Stored size: 1.56 KB

Contents

module HstoreAccessor
  module Serialization
    InvalidDataTypeError = Class.new(StandardError)

    VALID_TYPES = [
      :array,
      :boolean,
      :date,
      :datetime,
      :decimal,
      :float,
      :hash,
      :integer,
      :string
    ]

    DEFAULT_SERIALIZER = ->(value) { value.to_s }
    DEFAULT_DESERIALIZER = DEFAULT_SERIALIZER

    SEPARATOR = "||;||"

    SERIALIZERS = {
      array: -> value { (value && value.join(SEPARATOR)) || nil },
      boolean: -> value { (value.to_s == "true").to_s },
      date: -> value { value && value.to_s },
      hash: -> value { (value && value.to_json) || nil },
      datetime: -> value { value && value.to_i }
    }
    SERIALIZERS.default = DEFAULT_SERIALIZER

    DESERIALIZERS = {
      array: -> value { (value && value.split(SEPARATOR)) || nil },
      boolean: -> value { TypeHelpers.cast(:boolean, value) },
      date: -> value { value && Date.parse(value) },
      decimal: -> value { value && BigDecimal.new(value) },
      float: -> value { value && value.to_f },
      hash: -> value { (value && JSON.parse(value)) || nil },
      integer: -> value { value && value.to_i },
      datetime: -> value { value && Time.at(value.to_i).in_time_zone }
    }
    DESERIALIZERS.default = DEFAULT_DESERIALIZER

    class << self
      def serialize(type, value, serializer=SERIALIZERS[type])
        return nil if value.nil?

        serializer.call(value)
      end

      def deserialize(type, value, deserializer=DESERIALIZERS[type])
        return nil if value.nil?

        deserializer.call(value)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
hstore_accessor-0.9.3 lib/hstore_accessor/serialization.rb
hstore_accessor-0.9.2 lib/hstore_accessor/serialization.rb
hstore_accessor-0.9.1 lib/hstore_accessor/serialization.rb
hstore_accessor-0.9.0 lib/hstore_accessor/serialization.rb