lib/anyway/config.rb in anyway_config-2.1.0 vs lib/anyway/config.rb in anyway_config-2.2.0

- old
+ new

@@ -42,10 +42,11 @@ resolve_config_path tap to_h to_source_trace write_config_attr + __type_caster__ ].freeze class Error < StandardError; end class ValidationError < Error; end @@ -194,10 +195,51 @@ end end def new_empty_config() = {} + def coerce_types(mapping) + coercion_mapping.deep_merge!(mapping) + end + + def coercion_mapping + return @coercion_mapping if instance_variable_defined?(:@coercion_mapping) + + @coercion_mapping = if superclass < Anyway::Config + superclass.coercion_mapping.deep_dup + else + {} + end + end + + def type_caster(val = nil) + return @type_caster unless val.nil? + + @type_caster ||= + if coercion_mapping.empty? + fallback_type_caster + else + ::Anyway::TypeCaster.new(coercion_mapping, fallback: fallback_type_caster) + end + end + + def fallback_type_caster(val = nil) + return (@fallback_type_caster = val) unless val.nil? + + return @fallback_type_caster if instance_variable_defined?(:@fallback_type_caster) + + @fallback_type_caster = if superclass < Anyway::Config + superclass.fallback_type_caster.deep_dup + else + ::Anyway::AutoCast + end + end + + def disable_auto_cast! + @fallback_type_caster = ::Anyway::NoCast + end + private def define_config_accessor(*names) names.each do |name| accessors_module.module_eval <<~RUBY, __FILE__, __LINE__ + 1 @@ -371,21 +413,26 @@ def validate_required_attributes! self.class.required_attributes.select do |name| values[name].nil? || (values[name].is_a?(String) && values[name].empty?) end.then do |missing| next if missing.empty? - raise_validation_error "The following config parameters are missing or empty: #{missing.join(", ")}" + raise_validation_error "The following config parameters for `#{self.class.name}(config_name: #{self.class.config_name})` are missing or empty: #{missing.join(", ")}" end end def write_config_attr(key, val) key = key.to_sym return unless self.class.config_attributes.include?(key) + val = __type_caster__.coerce(key, val) public_send(:"#{key}=", val) end def raise_validation_error(msg) raise ValidationError, msg + end + + def __type_caster__ + self.class.type_caster end end end