class Google::Protobuf::FieldDescriptor

def self.new(*arguments, &block)

def self.new(*arguments, &block)
  raise "Descriptor objects may not be created from Ruby."
end

def self.private_constructor(field_def, descriptor_pool)

def self.private_constructor(field_def, descriptor_pool)
  instance = allocate
  instance.send(:initialize, field_def, descriptor_pool)
  instance
end

def c_type

def c_type
  @c_type ||= Google::Protobuf::FFI.get_c_type(self)
end

def clear(msg)

Parameters:
  • msg (Google::Protobuf::Message) --
def clear(msg)
  if msg.class.descriptor != Google::Protobuf::FFI.get_containing_message_def(self)
    raise TypeError.new "clear method called on wrong message type"
  end
  Google::Protobuf::FFI.clear_message_field msg.instance_variable_get(:@msg), self
  nil
end

def default

def default
  return nil if Google::Protobuf::FFI.is_sub_message(self)
  if Google::Protobuf::FFI.is_repeated(self)
    message_value = Google::Protobuf::FFI::MessageValue.new
  else
    message_value = Google::Protobuf::FFI.get_default(self)
  end
  enum_def = Google::Protobuf::FFI.get_subtype_as_enum(self)
  if enum_def.null?
    convert_upb_to_ruby message_value, c_type
  else
    convert_upb_to_ruby message_value, c_type, enum_def
  end
end

def from_native(field_def, _ = nil)

Parameters:
  • _ (Object) -- Unused
  • field_def (::FFI::Pointer) -- FieldDef pointer to be wrapped
def from_native(field_def, _ = nil)
  return nil if field_def.nil? or field_def.null?
  file_def = Google::Protobuf::FFI.file_def_by_raw_field_def(field_def)
  descriptor_from_file_def(file_def, field_def)
end

def get(msg)

Raises:
  • (TypeError) - If the field is not defined on this message.

Returns:
  • (Object) - Value of the field on this message.

Parameters:
  • msg (Google::Protobuf::Message) --
def get(msg)
  if msg.class.descriptor == Google::Protobuf::FFI.get_containing_message_def(self)
    msg.send :get_field, self
  else
    raise TypeError.new "get method called on wrong message type"
  end
end

def has?(msg)

Raises:
  • (ArgumentError) - If this field does not track presence
  • (TypeError) - If this field does not exist on the message

Returns:
  • (Boolean) - True iff message has this field set

Parameters:
  • msg (Google::Protobuf::Message) --
def has?(msg)
  if msg.class.descriptor != Google::Protobuf::FFI.get_containing_message_def(self)
    raise TypeError.new "has method called on wrong message type"
  end
  unless has_presence?
    raise ArgumentError.new "does not track presence"
  end
  Google::Protobuf::FFI.get_message_has msg.instance_variable_get(:@msg), self
end

def has_presence?

Returns:
  • (Boolean) - True iff this field tracks presence
def has_presence?
  @has_presence ||= Google::Protobuf::FFI.get_has_presence(self)
end

def initialize(field_def, descriptor_pool)

def initialize(field_def, descriptor_pool)
  @field_def = field_def
  @descriptor_pool = descriptor_pool
end

def inspect

def inspect
  "#{self.class.name}: #{name}"
end

def is_packed?

Returns:
  • (Boolean) - True iff this field is packed
def is_packed?
  @is_packed ||= Google::Protobuf::FFI.get_is_packed(self)
end

def json_name

def json_name
  @json_name ||= Google::Protobuf::FFI.get_json_name(self)
end

def label

DEPRECATED: Use required? or repeated? instead.
def label
  @label ||= Google::Protobuf::FFI.get_label(self)
end

def map?

def map?
  @map ||= Google::Protobuf::FFI.is_map self
end

def name

def name
  @name ||= Google::Protobuf::FFI.get_full_name(self)
end

def number

def number
  @number ||= Google::Protobuf::FFI.get_number(self)
end

def options

def options
  @options ||= begin
    size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
    temporary_arena = Google::Protobuf::FFI.create_arena
    buffer = Google::Protobuf::FFI.field_options(self, size_ptr, temporary_arena)
    opts = Google::Protobuf::FieldOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze)
    opts.clear_features()
    opts.freeze
  end
end

def real_containing_oneof

TODO Can this be added to the public API?
def real_containing_oneof
  @real_containing_oneof ||= Google::Protobuf::FFI.real_containing_oneof self
end

def repeated?

def repeated?
  @repeated ||= Google::Protobuf::FFI.is_repeated self
end

def required?

def required?
  @required ||= Google::Protobuf::FFI.is_required self
end

def set(msg, value)

Parameters:
  • value (Object) --
  • msg (Google::Protobuf::Message) --
def set(msg, value)
  if msg.class.descriptor != Google::Protobuf::FFI.get_containing_message_def(self)
    raise TypeError.new "set method called on wrong message type"
  end
  unless set_value_on_message value, msg.instance_variable_get(:@msg), msg.instance_variable_get(:@arena)
    raise RuntimeError.new "allocation failed"
  end
  nil
end

def set_value_on_message(value, msg, arena, wrap: false)

Parameters:
  • 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

def sub_message?

def sub_message?
  @sub_message ||= Google::Protobuf::FFI.is_sub_message self
end

def submsg_name

def submsg_name
  if defined? @submsg_name
    @submsg_name
  else
    @submsg_name = case c_type
      when :enum
        Google::Protobuf::FFI.get_enum_fullname Google::Protobuf::FFI.get_subtype_as_enum self
      when :message
        Google::Protobuf::FFI.get_message_fullname Google::Protobuf::FFI.get_subtype_as_message self
      else
        nil
      end
  end
end

def subtype

def subtype
  if defined? @subtype
    @subtype
  else
    @subtype = case c_type
      when :enum
        Google::Protobuf::FFI.get_subtype_as_enum(self)
      when :message
        Google::Protobuf::FFI.get_subtype_as_message(self)
      else
        nil
      end
  end
end

def to_native(value, _)

Parameters:
  • _ (Object) -- Unused
  • value (FieldDescriptor) -- FieldDescriptor to convert to an FFI native type
def to_native(value, _)
  field_def_ptr = value.instance_variable_get(:@field_def)
  warn "Underlying field_def was nil!" if field_def_ptr.nil?
  raise "Underlying field_def was null!" if !field_def_ptr.nil? and field_def_ptr.null?
  field_def_ptr
end

def to_proto

def to_proto
  @to_proto ||= begin
    size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
    temporary_arena = Google::Protobuf::FFI.create_arena
    buffer = Google::Protobuf::FFI.field_to_proto(self, size_ptr, temporary_arena)
    Google::Protobuf::FieldDescriptorProto.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze)
  end
end

def to_s

def to_s
  inspect
end

def type

def type
  @type ||= Google::Protobuf::FFI.get_type(self)
end

def wrapper?

def wrapper?
  if defined? @wrapper
    @wrapper
  else
    message_descriptor = Google::Protobuf::FFI.get_subtype_as_message(self)
    @wrapper = message_descriptor.nil? ? false : message_descriptor.send(:wrapper?)
  end
end