lib/toml-rb/keyvalue.rb in toml-rb-1.1.2 vs lib/toml-rb/keyvalue.rb in toml-rb-2.0.0

- old
+ new

@@ -1,32 +1,40 @@ +require_relative "inline_table" + module TomlRB class Keyvalue - attr_reader :value, :symbolize_keys + attr_reader :dotted_keys, :value, :symbolize_keys - def initialize(key, value) - @key = key + def initialize(dotted_keys, value) + @dotted_keys = dotted_keys @value = value @symbolize_keys = false end - def assign(hash, symbolize_keys = false) + def assign(hash, fully_defined_keys, symbolize_keys = false) @symbolize_keys = symbolize_keys - fail ValueOverwriteError.new(key) if hash.key?(key) - hash[key] = visit_value @value - end + 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 } } - def visit_inline_table(inline_table) - result = {} - - inline_table.value(@symbolize_keys).each do |k, v| - result[key k] = visit_value v + 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 - - result end - def key(a_key = @key) - symbolize_keys ? a_key.to_sym : a_key + 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 accept_visitor(parser) parser.visit_keyvalue self end