class EacRubyUtils::PathsHash::Node

def initialize(source_hash)

def initialize(source_hash)
  source_hash.assert_argument(Hash, 'source_hash')
  @data = source_hash.map { |k, v| [k.to_sym, v.is_a?(Hash) ? Node.new(v) : v] }.to_h
end

def read_entry(path, current)

def read_entry(path, current)
  validate_path(path, current)
  node_key = path.shift
  node = data[node_key]
  return (node.is_a?(Node) ? node.to_h : node) if path.empty?
  return nil if node.blank?
  return node.read_entry(path, current + [node_key]) if node.is_a?(Node)
  raise(EntryKeyError,
        "Path #{current.join(',')} is not a Node and path continues (#{current + path})")
end

def to_h

def to_h
  data.map { |k, v| [k, v.is_a?(Node) ? v.to_h : v] }.to_h
end

def validate_path(path, current)

def validate_path(path, current)
  path.assert_argument(Array, 'path')
  current.assert_argument(Array, 'current')
  raise EntryKeyError, 'Path is empty' if path.empty?
end

def write_entry(path, value, current)

def write_entry(path, value, current)
  validate_path(path, current)
  node_key = path.shift
  write_entry_value(path, node_key, value, current)
end

def write_entry_value(path, node_key, value, current)

def write_entry_value(path, node_key, value, current)
  if path.empty?
    data[node_key] = value.is_a?(Hash) ? Node.new(value) : value
  else
    data[node_key] = Node.new({}) unless data[node_key].is_a?(Node)
    data[node_key].write_entry(path, value, current + [node_key])
  end
end