79 lines
1.4 KiB
Ruby
79 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "concurrent/map"
|
|
|
|
require "dry/core/equalizer"
|
|
require "dry/configurable/constants"
|
|
|
|
module Dry
|
|
module Configurable
|
|
# A settings map
|
|
#
|
|
# @api private
|
|
class Settings
|
|
include Dry::Equalizer(:elements)
|
|
|
|
include Enumerable
|
|
|
|
# @api private
|
|
attr_reader :elements
|
|
|
|
# @api private
|
|
def initialize(elements = EMPTY_ARRAY)
|
|
initialize_elements(elements)
|
|
end
|
|
|
|
# @api private
|
|
def <<(setting)
|
|
elements[setting.name] = setting
|
|
self
|
|
end
|
|
|
|
# @api private
|
|
def [](name)
|
|
elements[name]
|
|
end
|
|
|
|
# @api private
|
|
def key?(name)
|
|
keys.include?(name)
|
|
end
|
|
|
|
# @api private
|
|
def keys
|
|
elements.keys
|
|
end
|
|
|
|
# @api private
|
|
def each(&block)
|
|
elements.values.each(&block)
|
|
end
|
|
|
|
# @api private
|
|
def pristine
|
|
self.class.new(map(&:pristine))
|
|
end
|
|
|
|
# @api private
|
|
def finalize!(freeze_values: false)
|
|
each { |element| element.finalize!(freeze_values: freeze_values) }
|
|
freeze
|
|
end
|
|
|
|
private
|
|
|
|
# @api private
|
|
def initialize_copy(source)
|
|
initialize_elements(source.map(&:dup))
|
|
end
|
|
|
|
# @api private
|
|
def initialize_elements(elements)
|
|
@elements = elements.each_with_object(Concurrent::Map.new) { |s, m|
|
|
m[s.name] = s
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|