#![allow(clippy::module_name_repetitions)]
pub mod message;
pub mod metadata;
pub mod request;
pub mod response;
pub use message::DynamicMessage;
pub use request::RequestMessage;
pub use response::ResponseMessage;
use crate::error::Error;
use crate::Result;
use prost_reflect::{DescriptorPool, MessageDescriptor, MethodDescriptor, ServiceDescriptor};
use std::path::Path;
#[derive(Default, Debug, Clone)]
pub struct ProtoDescriptor {
pool: DescriptorPool,
}
impl ProtoDescriptor {
pub fn new(
includes: impl IntoIterator<Item = impl AsRef<Path>>,
files: impl IntoIterator<Item = impl AsRef<Path>>,
) -> Result<Self> {
let file_desc_set = protox::compile(files, includes).map_err(Error::ProtoxCompileError)?;
let pool = DescriptorPool::from_file_descriptor_set(file_desc_set)
.map_err(Error::DescriptorError)?;
Ok(Self { pool })
}
#[must_use]
pub fn get_service_by_name(&self, name: &str) -> Option<ServiceDescriptor> {
self.pool.get_service_by_name(name)
}
#[must_use]
pub fn get_message_by_name(&self, name: &str) -> Option<MessageDescriptor> {
self.pool.get_message_by_name(name)
}
#[must_use]
pub fn get_method_by_name(
&self,
service_name: &str,
method_name: &str,
) -> Option<MethodDescriptor> {
self.get_service_by_name(service_name)?
.methods()
.find(|m| m.name() == method_name)
}
#[must_use]
pub fn get_services(&self) -> Vec<ServiceDescriptor> {
let mut services: Vec<ServiceDescriptor> = self.pool.services().collect();
services.sort_by(|a, b| a.full_name().cmp(b.full_name()));
services
}
#[must_use]
pub fn get_methods(&self, service: &ServiceDescriptor) -> Vec<MethodDescriptor> {
let mut methods: Vec<MethodDescriptor> = service.methods().collect();
methods.sort_by(|a, b| a.full_name().cmp(b.full_name()));
methods
}
#[must_use]
pub fn get_request_descriptor(&self, method: &MethodDescriptor) -> MessageDescriptor {
method.input()
}
#[must_use]
pub fn get_response_descriptor(&self, method: &MethodDescriptor) -> MessageDescriptor {
method.output()
}
#[must_use]
pub fn get_request(&self, method: &MethodDescriptor) -> RequestMessage {
RequestMessage::new(self.get_request_descriptor(method), method.clone())
}
#[must_use]
pub fn get_response(&self, method: &MethodDescriptor) -> ResponseMessage {
ResponseMessage::new(self.get_response_descriptor(method), method.clone())
}
}