Class: HaveAPI::ValidatorChain

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/validator_chain.rb

Overview

A chain of validators for one input parameter.

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ ValidatorChain

Returns a new instance of ValidatorChain.



4
5
6
7
8
9
10
11
12
13
14
# File 'lib/haveapi/validator_chain.rb', line 4

def initialize(args)
  @validators = []
  @required = false

  find_validators(args) do |validator|
    obj = validator.use(args)
    next unless obj.useful?
    @required = true if obj.is_a?(Validators::Presence)
    @validators << obj
  end
end

Instance Method Details

#add_or_replace(name, opt) ⇒ Object

Adds validator that takes option name with configuration in opt. If such validator already exists, it is reconfigured with newly provided opt.

If opt is nil, the validator is removed.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/haveapi/validator_chain.rb', line 21

def add_or_replace(name, opt)
  args = { name => opt }

  unless v_class = find_validator(args)
    fail "validator for '#{name}' not found"
  end

  exists = @validators.detect { |v| v.is_a?(v_class) }
  obj = exists

  if exists
    if opt.nil?
      @validators.delete(exists)

    else
      exists.reconfigure(name, opt)
      @validators.delete(exists) unless exists.useful?
    end

  else
    obj = v_class.use(args)
    @validators << obj if obj.useful?
  end

  if v_class == Validators::Presence
    @required = !opt.nil? && obj.useful? ? true : false
  end
end

#describeObject



55
56
57
58
59
60
61
62
# File 'lib/haveapi/validator_chain.rb', line 55

def describe
  ret = {}
  @validators.each do |v|
    ret[v.class.name] = v.describe
  end

  ret
end

#required?Boolean

Returns true if validator Validators::Presence is used.

Returns:



51
52
53
# File 'lib/haveapi/validator_chain.rb', line 51

def required?
  @required
end

#validate(value, params) ⇒ Object

Validate value using all configured validators. It returns either true if the value passed all validators or an array of errors.



67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/haveapi/validator_chain.rb', line 67

def validate(value, params)
  ret = []

  @validators.each do |validator|
    next if validator.validate(value, params)
    ret << validator.message % {
        value: value
    }
  end

  ret.empty? ? true : ret
end