Sha256: 39b30a51cd5bfdaadf396aa8527550f14c924106096ce76e10c0d09e794c513c

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

module Dry
  module Configurable
    # @private
    class Config
      DEFAULT_PROCESSOR = ->(v) { v }.freeze

      def self.create(settings)
        klass = ::Class.new(self)

        settings.each do |setting|
          klass.__send__(:define_method, setting.name) do
            @config[setting.name]
          end

          klass.__send__(:define_method, "#{setting.name}=") do |value|
            @config[setting.name] = setting.processor.call(value)
          end
        end

        klass.new(settings)
      end

      def initialize(settings)
        @config = ::Concurrent::Hash.new

        settings.each do |setting|
          if setting.none?
            @config[setting.name] = nil
          else
            public_send("#{setting.name}=", setting.value)
          end
        end
      end

      def dup
        dup = super
        dup.instance_variable_set(:@config, @config.dup)
        dup
      end

      def clone
        clone = super
        clone.instance_variable_set(:@config, @config.clone)
        clone
      end

      def to_h
        @config.each_with_object({}) do |tuple, hash|
          key, value = tuple

          if value.is_a?(::Dry::Configurable::Config)
            hash[key] = value.to_h
          else
            hash[key] = value
          end
        end
      end
      alias to_hash to_h

      def [](name)
        raise_unknown_setting_error(name) unless setting?(name)
        public_send(name)
      end

      def []=(name, value)
        raise_unknown_setting_error(name) unless setting?(name)
        public_send("#{name}=", value)
      end

      private

      def raise_unknown_setting_error(name)
        raise ArgumentError, "+#{name}+ is not a setting name"
      end

      def setting?(name)
        @config.key?(name.to_sym)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-configurable-0.6.2 lib/dry/configurable/config.rb