lib/datacaster/predefined.rb in datacaster-3.1.5 vs lib/datacaster/predefined.rb in datacaster-3.2.0
- old
+ new
@@ -14,10 +14,14 @@
def compare(value, error_key = nil)
Comparator.new(value, error_key)
end
+ def run(&block)
+ Runner.new(&block)
+ end
+
def transform(&block)
Transformer.new(&block)
end
def transform_if_present(&block)
@@ -43,10 +47,18 @@
fields.transform_values { |f| DefinitionDSL.expand(f) },
error_key
)
end
+ def strict_hash_schema(fields, error_key = nil)
+ schema(hash_schema(fields, error_key))
+ end
+
+ def choosy_hash_schema(fields, error_key = nil)
+ choosy_schema(hash_schema(fields, error_key))
+ end
+
def transform_to_hash(fields)
HashMapper.new(fields.transform_values { |x| DefinitionDSL.expand(x) })
end
def validate(active_model_validations)
@@ -63,10 +75,16 @@
def partial_schema(base)
ContextNodes::StructureCleaner.new(base, :pass)
end
+ # 'Around' types
+
+ def cast_around(&block)
+ AroundNodes::Caster.new(&block)
+ end
+
# 'Meta' types
def absent(error_key = nil, on: nil)
error_keys = ['.absent', 'datacaster.errors.absent']
error_keys.unshift(error_key) if error_key
@@ -149,14 +167,18 @@
def pass_if(base)
ContextNodes::PassIf.new(base)
end
def pick(*keys)
- if keys.empty? || keys.any? { |k| !Datacaster::Utils.pickable?(k) }
- raise RuntimeError, "each argument should be String, Symbol, Integer or an array thereof", caller
+ if keys.empty?
+ raise RuntimeError, "pick(key, ...) accepts at least one argument", caller
end
+ if wrong = keys.find { |k| !Datacaster::Utils.pickable?(k) }
+ raise RuntimeError, "each argument should be String, Symbol, Integer or an array thereof, instead got #{wrong.inspect}", caller
+ end
+
retrieve_key = -> (from, key) do
if from.respond_to?(:key?) && !from.key?(key)
Datacaster.absent
elsif from.respond_to?(:length) && key.is_a?(Integer) && key > 0 && key >= from.length
Datacaster.absent
@@ -240,18 +262,36 @@
error_keys = ['.responds_to', 'datacaster.errors.responds_to']
error_keys.unshift(error_key) if error_key
check { |x| x.respond_to?(method) }.i18n_key(*error_keys, reference: method.to_s)
end
+ def steps(*casters)
+ AndNode.new(*casters)
+ end
+
def switch(base = nil, **on_clauses)
switch = SwitchNode.new(base)
on_clauses.reduce(switch) do |result, (k, v)|
result.on(k, v)
end
end
def transform_to_value(value)
transform { value }
+ end
+
+ def with(keys, caster)
+ keys = Array(keys)
+
+ unless Datacaster::Utils.pickable?(keys)
+ raise RuntimeError, "provide String, Symbol, Integer or an array thereof instead of #{keys.inspect}", caller
+ end
+
+ if keys.length == 1
+ return transform_to_hash(keys[0] => pick(keys[0]) & caster)
+ end
+
+ with(keys[0], must_be(Enumerable) & with(keys[1..-1], caster))
end
# Strict types
def decimal(digits = 8, error_key = nil)