Class: Avro::Schema

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

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.errorsObject

Returns the value of attribute errors.



6
7
8
# File 'lib/avro_schema.rb', line 6

def errors
  @errors
end

Class Method Details

.validate(expected_schema, datum, name = nil, suppress_error = false) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
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
49
50
51
52
53
54
55
# File 'lib/avro_schema.rb', line 9

def self.validate(expected_schema, datum, name=nil, suppress_error=false)
  expected_type = expected_schema.type_sym

  valid = case expected_type
          when :null
            datum.nil?
          when :boolean
            datum == true || datum == false
          when :string, :bytes
            datum.is_a? String
          when :int
            (datum.is_a?(Fixnum) || datum.is_a?(Bignum)) &&
                (INT_MIN_VALUE <= datum) && (datum <= INT_MAX_VALUE)
          when :long
            (datum.is_a?(Fixnum) || datum.is_a?(Bignum)) &&
                (LONG_MIN_VALUE <= datum) && (datum <= LONG_MAX_VALUE)
          when :float, :double
            datum.is_a?(Float) || datum.is_a?(Fixnum) || datum.is_a?(Bignum)
          when :fixed
            datum.is_a?(String) && datum.size == expected_schema.size
          when :enum
            expected_schema.symbols.include? datum
          when :array
            datum.is_a?(Array) &&
              datum.all?{|d| validate(expected_schema.items, d) }
          when :map
            datum.keys.all?{|k| k.is_a? String } &&
              datum.values.all?{|v| validate(expected_schema.values, v) }
          when :union
            expected_schema.schemas.any?{|s| validate(s, datum, nil, true) }
          when :record, :error, :request
            datum.is_a?(Hash) &&
              expected_schema.fields.all?{|f| validate(f.type, datum[f.name], f.name) }
          else
            false
          end

  if !suppress_error && !valid && name
    if datum.nil? && expected_type != :null
      @errors << "Missing value at #{name}"
    else
      @errors << "'#{datum}' at #{name} doesn't match the type '#{expected_schema.to_s}'"
    end
  end

  valid
end