pub(crate) mod generated; use crate::descriptor::OneofDescriptorProto; use crate::reflect::file::index::OneofIndices; use crate::reflect::file::FileDescriptorImpl; use crate::reflect::oneof::generated::GeneratedOneofDescriptor; use crate::reflect::FieldDescriptor; use crate::reflect::FileDescriptor; use crate::reflect::MessageDescriptor; /// Oneof descriptor. #[derive(Eq, PartialEq, Clone, Debug)] pub struct OneofDescriptor { pub(crate) file_descriptor: FileDescriptor, pub(crate) index: usize, } pub(crate) enum OneofDescriptorImplRef { Generated(&'static GeneratedOneofDescriptor), Dynamic, } impl OneofDescriptor { fn index_entry(&self) -> &OneofIndices { &self.file_descriptor.common().oneofs[self.index] } /// `.proto` part associated with this descriptor pub fn proto(&self) -> &OneofDescriptorProto { let index_entry = self.index_entry(); let message_descriptor = self .file_descriptor .message_proto_by_index(index_entry.containing_message); &message_descriptor.oneof_decl[index_entry.index_in_containing_message] } /// Oneof name as specified in `.proto` file. pub fn name(&self) -> &str { self.proto().name() } #[allow(dead_code)] pub(crate) fn _get_impl(&self) -> OneofDescriptorImplRef { match &self.file_descriptor.imp { FileDescriptorImpl::Generated(g) => { OneofDescriptorImplRef::Generated(&g.oneofs[self.index]) } FileDescriptorImpl::Dynamic(..) => OneofDescriptorImplRef::Dynamic, } } /// Message which contains this oneof. pub fn containing_message(&self) -> MessageDescriptor { MessageDescriptor { file_descriptor: self.file_descriptor.clone(), index: self.index_entry().containing_message, } } /// This oneof is not present in sources. pub fn is_synthetic(&self) -> bool { self.index_entry().synthetic } /// Fully qualified name of oneof (fully qualified name of enclosing message /// followed by oneof name). pub fn full_name(&self) -> String { format!("{}.{}", self.containing_message(), self.name()) } /// Fields in this oneof. pub fn fields<'a>(&'a self) -> impl Iterator + 'a { let message = self.containing_message(); self.index_entry() .fields .iter() .map(move |&i| message.field_by_index(i)) } }