Module: JsonDef

Defined in:
lib/verify.rb

Constant Summary collapse

ANY_TYPE =
:wildcard
ANY_VALUE =
:any_value

Class Method Summary collapse

Class Method Details

.verify(obj, rule) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/verify.rb', line 8

def JsonDef.verify(obj, rule)
  case rule.class.to_s
  when 'JsonRuleObject'
    JsonDef.verify_object(obj, rule)
  when 'JsonRuleArray'
    JsonDef.verify_array(obj, rule)
  when 'JsonRuleString'
    JsonDef.verify_string(obj, rule)
  when 'JsonRuleNumber'
    JsonDef.verify_number(obj, rule)
  when 'JsonRuleBoolean'
    JsonDef.verify_bool(obj, rule)
  when 'JsonRuleNull'
    JsonDef.verify_null(obj, rule)
  else
    raise "Unknown rule at [verify] level: #{rule.class}"
  end
end

.verify_array(obj, rule) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
# File 'lib/verify.rb', line 79

def JsonDef.verify_array(obj, rule)
  return false unless obj.kind_of?(Array)
  return false unless rule.min_count < 0 || obj.count >= rule.min_count
  return false unless rule.max_count < 0 || obj.count <= rule.max_count

  if rule.unified_rule
    return false unless obj.all? { |e| JsonDef.verify(e, rule.unified_rule) }
  end

  true
end

.verify_bool(obj, rule) ⇒ Object



43
44
45
46
47
# File 'lib/verify.rb', line 43

def JsonDef.verify_bool(obj, rule)
  return false unless obj == true || obj == false
  return false unless JsonDef.verify_single_value(obj, rule)
  true
end

.verify_null(obj, rule) ⇒ Object



49
50
51
52
# File 'lib/verify.rb', line 49

def JsonDef.verify_null(obj, rule)
  return false unless JsonDef.verify_single_value(obj, rule)
  true
end

.verify_number(obj, rule) ⇒ Object



37
38
39
40
41
# File 'lib/verify.rb', line 37

def JsonDef.verify_number(obj, rule)
  return false unless obj.kind_of?(Numeric)
  return false unless JsonDef.verify_single_value(obj, rule)
  true
end

.verify_object(obj, rule) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/verify.rb', line 54

def JsonDef.verify_object(obj, rule)
  return false unless obj.kind_of?(Hash)

  rule.key_rules.each do |key_rule|
    return false if key_rule.required && !obj.has_key?(key_rule.key)
    return true unless obj.has_key?(key_rule.key)

    case
    when key_rule.rule == JsonDef::ANY_TYPE
      next
    when key_rule.rule.kind_of?(JsonRuleBase)
      return false unless JsonDef.verify(obj[key_rule.key], key_rule.rule)
    else
      return false
    end
  end

  # @todo In case of not allowing other keys, check if there are other not-allowed keys.
  if !rule.allow_other_keys
    obj.each { |k, v| return false unless rule.keys.member?(k) }
  end

  true
end

.verify_single_value(obj, rule) ⇒ Object



27
28
29
# File 'lib/verify.rb', line 27

def JsonDef.verify_single_value(obj, rule)
  rule.value == JsonDef::ANY_VALUE || rule.value == obj
end

.verify_string(obj, rule) ⇒ Object



31
32
33
34
35
# File 'lib/verify.rb', line 31

def JsonDef.verify_string(obj, rule)
  return false unless obj.kind_of?(String)
  return false unless JsonDef.verify_single_value(obj, rule)
  true
end