class Datacaster::Terminator
Public Instance Methods
call(object, checked_schema = nil)
click to toggle source
Calls superclass method
Datacaster::Base#call
# File lib/datacaster/terminator.rb, line 9 def call(object, checked_schema = nil) object = super(object) checked_schema ||= object.meta[:checked_schema] case object.value when Array check_array(object.value, checked_schema) when Hash check_hash(object.value, checked_schema) else Datacaster.ValidResult(object.value) end end
inspect()
click to toggle source
# File lib/datacaster/terminator.rb, line 23 def inspect "#<Datacaster::Terminator>" end
Private Instance Methods
check_array(array, checked_schema)
click to toggle source
# File lib/datacaster/terminator.rb, line 29 def check_array(array, checked_schema) return Datacaster.ValidResult(array) unless checked_schema result = array.zip(checked_schema).map { |x, schema| call(x, schema) } if result.all?(&:valid?) Datacaster.ValidResult(result.map(&:value)) else Datacaster.ErrorResult(result.each.with_index.reject { |x, _| x.valid? }.map { |x, i| [i, x.errors] }.to_h) end end
check_hash(hash, checked_schema)
click to toggle source
# File lib/datacaster/terminator.rb, line 41 def check_hash(hash, checked_schema) return Datacaster.ValidResult(hash) unless checked_schema errors = {} result = {} hash.each do |(k, v)| if v == Datacaster.absent next end unless checked_schema.key?(k) errors[k] = ["must be absent"] next end if checked_schema[k] == true result[k] = v next end nested_value = call(v, checked_schema[k]) if nested_value.valid? result[k] = nested_value.value else errors[k] = nested_value.errors end end if errors.empty? Datacaster.ValidResult(result) else Datacaster.ErrorResult(errors) end end