class Google::Protobuf::FieldDescriptor
def set_value_on_message(value, msg, arena, wrap: false)
-
arena(Arena) -- Arena of the message that owns msg -
msg(::FFI::Pointer) -- Pointer the the upb_Message -
value(Object) -- Value to be set
def set_value_on_message(value, msg, arena, wrap: false) message_to_alter = msg field_def_to_set = self if map? raise TypeError.new "Expected map" unless value.is_a? Google::Protobuf::Map message_descriptor = subtype key_field_def = Google::Protobuf::FFI.get_field_by_number(message_descriptor, 1) key_field_type = Google::Protobuf::FFI.get_type(key_field_def) raise TypeError.new "Map key type does not match field's key type" unless key_field_type == value.send(:key_type) value_field_def = Google::Protobuf::FFI.get_field_by_number(message_descriptor, 2) value_field_type = Google::Protobuf::FFI.get_type(value_field_def) raise TypeError.new "Map value type does not match field's value type" unless value_field_type == value.send(:value_type) raise TypeError.new "Map value type has wrong message/enum class" unless value_field_def.subtype == value.send(:descriptor) arena.fuse(value.send(:arena)) message_value = Google::Protobuf::FFI::MessageValue.new message_value[:map_val] = value.send(:map_ptr) elsif repeated? raise TypeError.new "Expected repeated field array" unless value.is_a? RepeatedField raise TypeError.new "Repeated field array has wrong message/enum class" unless value.send(:type) == type arena.fuse(value.send(:arena)) message_value = Google::Protobuf::FFI::MessageValue.new message_value[:array_val] = value.send(:array) else if value.nil? and (sub_message? or !real_containing_oneof.nil?) Google::Protobuf::FFI.clear_message_field message_to_alter, field_def_to_set return true end if wrap value_field_def = Google::Protobuf::FFI.get_field_by_number subtype, 1 type_for_conversion = Google::Protobuf::FFI.get_c_type(value_field_def) raise RuntimeError.new "Not expecting to get a msg or enum when unwrapping" if [:enum, :message].include? type_for_conversion message_value = convert_ruby_to_upb(value, arena, type_for_conversion, nil) message_to_alter = Google::Protobuf::FFI.get_mutable_message(msg, self, arena)[:msg] field_def_to_set = value_field_def else message_value = convert_ruby_to_upb(value, arena, c_type, subtype) end end Google::Protobuf::FFI.set_message_field message_to_alter, field_def_to_set, message_value, arena end