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