class GrpcSerializer

Constants

CUSTOM_ENCODED_TYPES
REPEATED_ENCODED_TYPES

Public Class Methods

grpc_object_to_hash(source_hash, message_class) click to toggle source
# File lib/grpc_serializer.rb, line 11
def self.grpc_object_to_hash(source_hash, message_class)
  final_hash = source_hash.dup
  value, _ = deserialize_with_descriptor(message_class.descriptor, final_hash)
  value
end
hash_to_grpc_object(source_hash, message_class) click to toggle source
# File lib/grpc_serializer.rb, line 6
def self.hash_to_grpc_object(source_hash, message_class)
  final_hash = source_hash.dup
  serialize_with_descriptor(message_class.descriptor, final_hash )
end

Private Class Methods

deserialize_with_descriptor(descriptor_class, rpc_value) click to toggle source
# File lib/grpc_serializer.rb, line 73
def self.deserialize_with_descriptor(descriptor_class, rpc_value)
   new_hash = {}
   return [rpc_value, false] if rpc_value.nil?

   return [rpc_value, true] if descriptor_class.nil?

   descriptor_class.entries.each do |entry|

     value, is_serialized =  deserialize_with_field_descriptor(entry, rpc_value[entry.name])

     if is_serialized
       new_hash[entry.name.to_sym] = value
     end
   end

   [new_hash, true]
 end
deserialize_with_field_descriptor(field_descriptor, value) click to toggle source
# File lib/grpc_serializer.rb, line 92
def self.deserialize_with_field_descriptor(field_descriptor, value)

  return [value, false] if value.nil?

  return [value, true] if field_descriptor.nil?

  if field_descriptor.label == :repeated
    return deserialize_with_repeated_field(field_descriptor, value)
  end

  if field_descriptor.type == :message
    custom_encode = CUSTOM_ENCODED_TYPES[field_descriptor.subtype.msgclass]
    repeated_encode = REPEATED_ENCODED_TYPES[field_descriptor.subtype.msgclass]
    if custom_encode || repeated_encode
      return [nil, false] if value.respond_to?(:kind) && value.kind == :exclude_value
      return [field_descriptor.subtype.msgclass.decode_value(value), true]
    end
    if field_descriptor.subtype.is_a?(Google::Protobuf::Descriptor)
      return deserialize_with_descriptor(field_descriptor.subtype, value) unless value.nil?
    end

    return [value.to_h, true]

  end
  [value, true]
end
deserialize_with_repeated_field(field_descriptor, value) click to toggle source
# File lib/grpc_serializer.rb, line 119
def self.deserialize_with_repeated_field(field_descriptor, value)

  return [value, false] if value.nil?

  if field_descriptor.label == :repeated

    if field_descriptor.subtype && field_descriptor.subtype.lookup("key")
      if field_descriptor.subtype.lookup("value")
        value_dup = ({}).dup
        org_value = value || {}
        org_value.keys.each do |k|
          field_value, is_serialized = deserialize_with_field_descriptor(field_descriptor.subtype.lookup("value"), org_value[k])
          if is_serialized
            value_dup[k.to_sym] = field_value
          end
        end
        return [value_dup, true]
      else
        return [value.to_h, true]
      end
    end

    final_value = []
    (value || []).map do |v|
      field_value, is_serialized = deserialize_with_descriptor(field_descriptor.subtype, v)
      final_value << field_value if is_serialized
    end

    return [final_value, true]
  end
end
serialize_with_descriptor(descriptor_class, hash_value, render_as_hash: false) click to toggle source
# File lib/grpc_serializer.rb, line 19
def self.serialize_with_descriptor(descriptor_class, hash_value, render_as_hash: false)
  new_hash = {}
  return hash_value if descriptor_class.nil?
  available_keys = hash_value.keys
  descriptor_class.entries.each do |entry|
    is_key_present = available_keys.include?(entry.name.to_sym)
    value =  serialize_with_field_descriptor(entry, hash_value[entry.name.to_sym], is_key_present: is_key_present)
    unless value.nil?
      new_hash[entry.name] = value
    end
  end

  render_as_hash ? new_hash : descriptor_class.msgclass.new(new_hash)
end
serialize_with_field_descriptor(field_descriptor, value, is_key_present: true) click to toggle source
# File lib/grpc_serializer.rb, line 34
def self.serialize_with_field_descriptor(field_descriptor, value, is_key_present: true)
  return value if field_descriptor.nil?

  if field_descriptor.label == :repeated
    return serialize_with_repeated_field(field_descriptor, value)
  end
  if field_descriptor.type == :message
    custom_encode = CUSTOM_ENCODED_TYPES[field_descriptor.subtype.msgclass]
    if custom_encode
      return field_descriptor.subtype.msgclass.encode_value(value, is_key_present)
    end
    if field_descriptor.subtype.is_a?(Google::Protobuf::Descriptor)
      return serialize_with_descriptor(field_descriptor.subtype, value) unless value.nil?
    end

    return field_descriptor.subtype.msgclass.new(value) unless value.nil?

  end
  value
end
serialize_with_repeated_field(field_descriptor, value) click to toggle source
# File lib/grpc_serializer.rb, line 55
 def self.serialize_with_repeated_field(field_descriptor, value)
  if field_descriptor.label == :repeated
    if field_descriptor.subtype && field_descriptor.subtype.lookup("key")
      if field_descriptor.subtype.lookup("value")
        value_dup = ({})
        org_value = value || {}
        org_value.keys.each do |k|
          value_dup[k.to_s] = (serialize_with_field_descriptor(field_descriptor.subtype.lookup("value"), org_value[k]))
        end
        return value_dup
      else
        return value
      end
    end
    return (value || []).map  { |v| serialize_with_descriptor(field_descriptor.subtype, v) }
  end
end