class RSchema::Coercers::FixedHash::SymbolizeKeys

Coerces `String` keys into `Symbol`s according to the attributes in a given `FixedHash` schema.

Attributes

hash_attributes[R]

Public Class Methods

build(schema) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 15
def self.build(schema)
  new(schema)
end
new(fixed_hash_schema) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 19
def initialize(fixed_hash_schema)
  # TODO: make fixed hash attributes frozen, and eliminate dup
  @hash_attributes = fixed_hash_schema.attributes.map(&:dup)
end

Public Instance Methods

call(value) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 24
def call(value)
  Result.success(symbolize_keys(value))
end
will_affect?(_value) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 28
def will_affect?(_value)
  keys_to_symbolize(hash).any?
end

Private Instance Methods

all_keys() click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 68
def all_keys
  @all_keys ||= hash_attributes.map(&:key)
end
keys_to_symbolize(value) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 45
def keys_to_symbolize(value)
  if value.is_a?(Hash)
    non_string_keys = Set.new(value.keys) - string_keys
    non_string_keys.intersection(symbol_keys_as_strings)
  else
    []
  end
end
string_keys() click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 62
def string_keys
  @string_keys ||= Set.new(
    all_keys.select { |k| k.is_a?(::String) },
  )
end
symbol_keys_as_strings() click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 54
def symbol_keys_as_strings
  @symbol_keys_as_strings ||= Set.new(
    all_keys
      .select { |k| k.is_a?(::Symbol) }
      .map(&:to_s),
  )
end
symbolize_keys(hash) click to toggle source
# File lib/rschema/coercers/fixed_hash/symbolize_keys.rb, line 34
def symbolize_keys(hash)
  keys = keys_to_symbolize(hash)
  if keys.any?
    hash.dup.tap do |new_hash|
      keys.each { |k| new_hash[k.to_sym] = new_hash.delete(k) }
    end
  else
    hash
  end
end