class Thrift::Validator

Constants

VERSION

Public Instance Methods

recurse?(field) click to toggle source
# File lib/thrift/validator.rb, line 45
def recurse?(field)
  field[:class] && field[:class] < ::Thrift::Struct
end
validate(source) click to toggle source
# File lib/thrift/validator.rb, line 6
def validate(source)
  begin
    source.validate
  rescue Thrift::ProtocolException => ex
    message = "#{source.class.name}: #{ex}"
    raise Thrift::ProtocolException.new(ex.type, message)
  end

  source.struct_fields.each_pair do |_, field|
    type, name = field.fetch(:type), field.fetch(:name)
    case type
    when Types::STRUCT
      next if source.kind_of?(Union) && source.get_set_field.to_s != name

      if source.send(name)
        validate source.send(name)
      end
    when Types::LIST, Types::SET
      if recurse? field.fetch(:element)
        Array(source.send(name)).each do |item|
          validate item
        end
      end
    when Types::MAP
      if recurse? field.fetch(:key)
        Hash(source.send(name)).each_key do |key_value|
          validate key_value
        end
      end

      if recurse? field.fetch(:value)
        Hash(source.send(name)).each_value do |value_value|
          validate value_value
        end
      end
    end
  end
end