Module: RSchema

Defined in:
lib/rschema.rb,
lib/rschema/version.rb,
lib/rschema/rails_interop.rb

Defined Under Namespace

Modules: CoercionMapper, DSL, RailsInterop Classes: EnumSchema, ErrorDetails, GenericHashSchema, GenericSetSchema, MaybeSchema, OptionalHashKey, PredicateSchema

Constant Summary collapse

InvalidSchemaError =
Class.new(StandardError)
ValidationError =
Class.new(StandardError)
VERSION =
'0.1.0'

Class Method Summary collapse

Class Method Details

.coerce(schema, value) ⇒ Object



30
31
32
# File 'lib/rschema.rb', line 30

def self.coerce(schema, value)
  walk(schema, value, CoercionMapper)
end

.coerce!(schema, value) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/rschema.rb', line 34

def self.coerce!(schema, value)
  result, error = walk(schema, value, CoercionMapper)
  if error.nil?
    result
  else
    raise(ValidationError, error)
  end
end

.schema(&block) ⇒ Object



12
13
14
# File 'lib/rschema.rb', line 12

def self.schema(&block)
  DSL.instance_exec(&block)
end

.validate!(schema, value) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/rschema.rb', line 21

def self.validate!(schema, value)
  result, error = walk(schema, value)
  if error.nil?
    result
  else
    raise(ValidationError, error)
  end
end

.validation_errors(schema, value) ⇒ Object



16
17
18
19
# File 'lib/rschema.rb', line 16

def self.validation_errors(schema, value)
  _, error = walk(schema, value)
  error
end

.walk(schema, value, mapper = nil) ⇒ Object

Raises:



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rschema.rb', line 43

def self.walk(schema, value, mapper = nil)
  raise(InvalidSchemaError, schema) unless schema.respond_to?(:schema_walk)
  value = mapper.prewalk(schema, value) if mapper
  value = schema.schema_walk(value, mapper)
  value = mapper.postwalk(schema, value) if mapper

  if value.is_a?(RSchema::ErrorDetails)
    [nil, value]
  else
    [value, nil]
  end
end