Sha256: 588d3ce7922ae8e3983475295a7f70f4437910c375d0042237d61c66960638f6

Contents?: true

Size: 1.52 KB

Versions: 80

Compression:

Stored size: 1.52 KB

Contents

require_relative "inline_table"

module TomlRB
  class Keyvalue
    attr_reader :dotted_keys, :value, :symbolize_keys

    def initialize(dotted_keys, value)
      @dotted_keys = dotted_keys
      @value = value
      @symbolize_keys = false
    end

    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)
      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

    private

    def visit_value(a_value)
      return a_value unless a_value.respond_to? :accept_visitor

      a_value.accept_visitor self
    end
  end

  # Used in document.citrus
  module KeyvalueParser
    def value
      TomlRB::Keyvalue.new(capture(:stripped_key).value, capture(:v).value)
    end
  end
end

Version data entries

80 entries across 80 versions & 2 rubygems

Version Path
toml-rb-4.0.0 lib/toml-rb/keyvalue.rb
harbr-2.8.1 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
toml-rb-3.0.1 lib/toml-rb/keyvalue.rb
toml-rb-3.0.0 lib/toml-rb/keyvalue.rb
harbr-0.2.10 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.9 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.8 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.7 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.6 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.5 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.4 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.3 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.2 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.1 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.2.0 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.1.99 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.1.98 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.1.97 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.1.96 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb
harbr-0.1.95 vendor/bundle/ruby/3.2.0/gems/toml-rb-2.2.0/lib/toml-rb/keyvalue.rb