Sha256: fe6d5d93dacb15b38539a66cd1e0bea98a40e992c2e2d8aeab921e026ee96bf1

Contents?: true

Size: 1.19 KB

Versions: 2

Compression:

Stored size: 1.19 KB

Contents

# frozen_string_literal: true

require 'active_model'

module ActiveRecordBitmask
  class BitmaskType < ActiveModel::Type::Value
    # @param name [String]
    # @param map [ActiveRecordBitmask::Map]
    # @param sub_type [ActiveModel::Type::Value]
    def initialize(_name, map, sub_type)
      @map = map
      @sub_type = sub_type
    end

    # @return [Symbol]
    def type
      @sub_type.type
    end

    # @return [Array<Symbol>]
    def cast(value)
      return [] if value.blank?

      bitmask = @map.bitmask_or_attributes_to_bitmask(value)
      @map.bitmask_to_attributes(bitmask)
    end

    # @return [Integer]
    def serialize(value)
      @map.bitmask_or_attributes_to_bitmask(value) || 0
    end

    # @param raw_value [Integer, nil]
    #
    # @return [Array<Symbol>]
    def deserialize(raw_value)
      value = @sub_type.deserialize(raw_value)
      return [] if value.nil?

      @map.bitmask_to_attributes(value)
    end

    # @param raw_old_value [Integer]
    # @param new_value [Array<Symbol>]
    #
    # @return [boolean]
    def changed_in_place?(raw_old_value, new_value)
      raw_old_value.nil? != new_value.nil? ||
        cast(raw_old_value) != cast(new_value)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active_record_bitmask-0.0.2 lib/active_record_bitmask/bitmask_type.rb
active_record_bitmask-0.0.1 lib/active_record_bitmask/bitmask_type.rb