use buffa_descriptor::generated::descriptor::FileDescriptorProto;
use crate::{
enumeration::EnumDescriptor,
message::MessageDescriptor,
pool::{DescriptorPool, FileIndex},
};
#[derive(Clone, Debug)]
pub struct FileDescriptor {
pub(crate) pool: DescriptorPool,
pub(crate) index: FileIndex,
}
impl FileDescriptor {
#[must_use]
pub fn name(&self) -> &str {
let entry = &self.pool.inner.files[self.index as usize];
entry.proto.name.as_deref().unwrap_or("")
}
#[must_use]
pub fn package(&self) -> &str {
let entry = &self.pool.inner.files[self.index as usize];
entry.proto.package.as_deref().unwrap_or("")
}
#[must_use]
pub fn syntax(&self) -> &str {
let entry = &self.pool.inner.files[self.index as usize];
entry.proto.syntax.as_deref().unwrap_or("proto2")
}
pub fn messages(&self) -> impl ExactSizeIterator<Item = MessageDescriptor> + '_ {
let pool = self.pool.clone();
let entry = &self.pool.inner.files[self.index as usize];
entry
.messages
.clone()
.into_iter()
.map(move |idx| MessageDescriptor {
pool: pool.clone(),
index: idx,
})
}
pub fn enums(&self) -> impl ExactSizeIterator<Item = EnumDescriptor> + '_ {
let pool = self.pool.clone();
let entry = &self.pool.inner.files[self.index as usize];
entry
.enums
.clone()
.into_iter()
.map(move |idx| EnumDescriptor {
pool: pool.clone(),
index: idx,
})
}
#[must_use]
pub fn parent_pool(&self) -> DescriptorPool {
self.pool.clone()
}
#[must_use]
pub fn descriptor_proto(&self) -> &FileDescriptorProto {
&self.pool.inner.files[self.index as usize].proto
}
}
impl PartialEq for FileDescriptor {
fn eq(&self, other: &Self) -> bool {
std::sync::Arc::ptr_eq(&self.pool.inner, &other.pool.inner) && self.index == other.index
}
}
impl Eq for FileDescriptor {}