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