Sha256: 9a2aab60e9240b00c175f30f2046dd5dab5eafbf664a98fa6b1c73f5c6290b31

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

require "config_mapper/factory"
require "config_mapper/validator"
require "forwardable"

module ConfigMapper

  class ConfigDict

    class Factory

      def initialize(entry_factory, key_validator)
        @entry_factory = ConfigMapper::Factory.resolve(entry_factory)
        @key_validator = ConfigMapper::Validator.resolve(key_validator)
      end

      attr_reader :entry_factory
      attr_reader :key_validator

      def new
        ConfigDict.new(@entry_factory, @key_validator)
      end

      def config_doc
        return {} unless entry_factory.respond_to?(:config_doc)

        {}.tap do |result|
          entry_factory.config_doc.each do |path, doc|
            result["[X]#{path}"] = doc
          end
        end
      end

    end

    def initialize(entry_factory, key_validator = nil)
      @entry_factory = entry_factory
      @key_validator = key_validator
      @entries = {}
    end

    def [](key)
      key = @key_validator.call(key) if @key_validator
      @entries[key] ||= @entry_factory.new
    end

    def to_h
      {}.tap do |result|
        @entries.each do |key, value|
          result[key] = value.to_h
        end
      end
    end

    def config_errors
      {}.tap do |errors|
        each do |key, value|
          prefix = "[#{key.inspect}]"
          next unless value.respond_to?(:config_errors)

          value.config_errors.each do |path, path_errors|
            errors["#{prefix}#{path}"] = path_errors
          end
        end
      end
    end

    extend Forwardable

    def_delegators :@entries, :each, :empty?, :key?, :keys, :map, :size

    include Enumerable

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
config_mapper-1.8.0 lib/config_mapper/config_dict.rb