module Datacaster::Predefined

Public Instance Methods

absent() click to toggle source

'Meta' types

# File lib/datacaster/predefined.rb, line 51
def absent
  check('Absent', 'must be absent') { |x| x == Datacaster.absent }
end
any() click to toggle source
# File lib/datacaster/predefined.rb, line 55
def any
  check('Any', 'must be set') { |x| x != Datacaster.absent }
end
array() click to toggle source
# File lib/datacaster/predefined.rb, line 111
def array
  check('Array', 'must be array') { |x| x.is_a?(Array) }
end
array_schema(element_caster) click to toggle source
# File lib/datacaster/predefined.rb, line 33
def array_schema(element_caster)
  ArraySchema.new(element_caster)
end
cast(name = 'Anonymous', &block) click to toggle source

Base types

# File lib/datacaster/predefined.rb, line 7
def cast(name = 'Anonymous', &block)
  Caster.new(name, &block)
end
check(name = 'Anonymous', error = 'is invalid', &block) click to toggle source
# File lib/datacaster/predefined.rb, line 11
def check(name = 'Anonymous', error = 'is invalid', &block)
  Checker.new(name, error, &block)
end
compare(value, name = 'Anonymous', error = nil) click to toggle source
# File lib/datacaster/predefined.rb, line 15
def compare(value, name = 'Anonymous', error = nil)
  Comparator.new(value, name, error)
end
decimal(digits = 8) click to toggle source

Strict types

# File lib/datacaster/predefined.rb, line 102
def decimal(digits = 8)
  Trier.new('Decimal', 'must be decimal', [ArgumentError, TypeError]) do |x|
    # strictly validate format of string, BigDecimal() doesn't do that
    Float(x)

    BigDecimal(x, digits)
  end
end
float() click to toggle source
# File lib/datacaster/predefined.rb, line 115
def float
  check('Float', 'must be float') {  |x| x.is_a?(Float) }
end
hash_schema(fields) click to toggle source
# File lib/datacaster/predefined.rb, line 37
def hash_schema(fields)
  HashSchema.new(fields)
end
hash_value() click to toggle source

'hash' is a bad method name, because it will overwrite built in Object#hash

# File lib/datacaster/predefined.rb, line 120
def hash_value
  check('Hash', 'must be hash') { |x| x.is_a?(Hash) }
end
hash_with_symbolized_keys() click to toggle source
# File lib/datacaster/predefined.rb, line 124
def hash_with_symbolized_keys
  hash_value & transform("SymbolizeKeys") { |x| x.symbolize_keys }
end
integer() click to toggle source
# File lib/datacaster/predefined.rb, line 128
def integer
  check('Integer', 'must be integer') { |x| x.is_a?(Integer) }
end
integer32() click to toggle source
# File lib/datacaster/predefined.rb, line 132
def integer32
  integer & check('FourBytes', 'out of range') { |x| x.abs <= 2_147_483_647 }
end
iso8601() click to toggle source

Form request types

# File lib/datacaster/predefined.rb, line 146
def iso8601
  string &
    try('ISO8601', 'must be iso8601 string', catched_exception: [ArgumentError, TypeError]) { |x| DateTime.iso8601(x) }
end
must_be(klass) click to toggle source
# File lib/datacaster/predefined.rb, line 92
def must_be(klass)
  check('MustBe', "must be #{klass.inspect}") { |x| x.is_a?(klass) }
end
non_empty_string() click to toggle source
# File lib/datacaster/predefined.rb, line 140
def non_empty_string
  string & check('NonEmptyString', 'must be present') { |x| !x.empty? }
end
optional(base) click to toggle source
# File lib/datacaster/predefined.rb, line 96
def optional(base)
  absent | base
end
optional_param(base) click to toggle source
# File lib/datacaster/predefined.rb, line 175
def optional_param(base)
  transform_if_present("optional_param(#{base.inspect})") { |x| x == '' ? Datacaster::Absent.instance : x } & (absent | base)
end
pass() click to toggle source
# File lib/datacaster/predefined.rb, line 67
def pass
  transform('Pass', &:itself)
end
pick(*keys) click to toggle source
# File lib/datacaster/predefined.rb, line 71
def pick(*keys)
  must_be(Enumerable) & transform("Picker") { |value|
    result =
      keys.map do |key|
        if value.respond_to?(:key?) && !value.key?(key)
          Datacaster.absent
        elsif value.respond_to?(:length) && key.is_a?(Integer) && key > 0 && key >= value.length
          Datacaster.absent
        else
          value[key]
        end
      end

    keys.length == 1 ? result.first : result
  }
end
remove() click to toggle source
# File lib/datacaster/predefined.rb, line 63
def remove
  transform('Remove') { Datacaster.absent }
end
responds_to(method) click to toggle source
# File lib/datacaster/predefined.rb, line 88
def responds_to(method)
  check('RespondsTo', "must respond to #{method.inspect}") { |x| x.respond_to?(method) }
end
string() click to toggle source
# File lib/datacaster/predefined.rb, line 136
def string
  check('String', 'must be string') { |x| x.is_a?(String) }
end
to_boolean() click to toggle source
# File lib/datacaster/predefined.rb, line 151
def to_boolean
  cast('ToBoolean') do |x|
    if ['true', '1', true].include?(x)
      Datacaster.ValidResult(true)
    elsif ['false', '0', false].include?(x)
      Datacaster.ValidResult(false)
    else
      Datacaster.ErrorResult(['must be boolean'])
    end
  end
end
to_float() click to toggle source
# File lib/datacaster/predefined.rb, line 163
def to_float
  Trier.new('ToFloat', 'must be float', [ArgumentError, TypeError]) do |x|
    Float(x)
  end
end
to_integer() click to toggle source
# File lib/datacaster/predefined.rb, line 169
def to_integer
  Trier.new('ToInteger', 'must be integer', [ArgumentError, TypeError]) do |x|
    Integer(x)
  end
end
transform(name = 'Anonymous', &block) click to toggle source
# File lib/datacaster/predefined.rb, line 19
def transform(name = 'Anonymous', &block)
  Transformer.new(name, &block)
end
transform_if_present(name = 'Anonymous', &block) click to toggle source
# File lib/datacaster/predefined.rb, line 23
def transform_if_present(name = 'Anonymous', &block)
  raise 'Expected block' unless block_given?

  Transformer.new(name) { |v| v == Datacaster.absent ? v : block.(v) }
end
transform_to_hash(fields) click to toggle source
# File lib/datacaster/predefined.rb, line 41
def transform_to_hash(fields)
  HashMapper.new(fields)
end
transform_to_value(value) click to toggle source
# File lib/datacaster/predefined.rb, line 59
def transform_to_value(value)
  transform('ToValue') { value }
end
try(name = 'Anonymous', error = 'is invalid', catched_exception:, &block) click to toggle source
# File lib/datacaster/predefined.rb, line 29
def try(name = 'Anonymous', error = 'is invalid', catched_exception:, &block)
  Trier.new(name, error, catched_exception, &block)
end
validate(active_model_validations, name = 'Anonymous') click to toggle source
# File lib/datacaster/predefined.rb, line 45
def validate(active_model_validations, name = 'Anonymous')
  Validator.new(active_model_validations, name)
end