class TomlRB::Keyvalue
def accept_visitor(parser)
def accept_visitor(parser) parser.visit_keyvalue self end
def assign(hash, fully_defined_keys, symbolize_keys = false)
def assign(hash, fully_defined_keys, symbolize_keys = false) @symbolize_keys = symbolize_keys dotted_keys_str = @dotted_keys.join(".") keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys update = keys.reverse.inject(visit_value(@value)) { |k1, k2| {k2 => k1} } if @value.is_a?(InlineTable) fully_defined_keys << dotted_keys_str hash.merge!(update) { |key, _, _| fail ValueOverwriteError.new(key) } elsif fully_defined_keys.find { |k| update.dig(*k) } hash.merge!(update) { |key, _, _| fail ValueOverwriteError.new(key) } else dotted_key_merge(hash, update) end end
def dotted_key_merge(hash, update)
def dotted_key_merge(hash, update) hash.merge!(update) { |key, old, new| if old.is_a?(Hash) && new.is_a?(Hash) dotted_key_merge(old, new) else fail ValueOverwriteError.new(key) end } end
def initialize(dotted_keys, value)
def initialize(dotted_keys, value) @dotted_keys = dotted_keys @value = value @symbolize_keys = false end
def visit_value(a_value)
def visit_value(a_value) return a_value unless a_value.respond_to? :accept_visitor a_value.accept_visitor self end