wireman_core/descriptor/
mod.rs1#![allow(clippy::module_name_repetitions)]
2pub mod message;
3pub mod metadata;
4pub mod reflection_request;
5pub mod request;
6pub mod response;
7
8pub use message::DynamicMessage;
9pub use reflection_request::ReflectionRequest;
10pub use request::RequestMessage;
11pub use response::ResponseMessage;
12
13use crate::{client::reflection::build_file_descriptor_set, error::Error, Result};
14use prost_reflect::{DescriptorPool, MessageDescriptor, MethodDescriptor, ServiceDescriptor};
15use std::path::Path;
16
17#[derive(Default, Debug, Clone)]
18pub struct ProtoDescriptor {
19 pool: DescriptorPool,
20}
21
22impl ProtoDescriptor {
23 pub fn new(
29 includes: impl IntoIterator<Item = impl AsRef<Path>>,
30 files: impl IntoIterator<Item = impl AsRef<Path>>,
31 ) -> Result<Self> {
32 let file_desc_set = protox::compile(files, includes).map_err(Error::ProtoxCompileError)?;
34 let pool = DescriptorPool::from_file_descriptor_set(file_desc_set)
36 .map_err(Error::DescriptorError)?;
37 Ok(Self { pool })
38 }
39
40 pub async fn from_reflection(request: ReflectionRequest) -> Result<Self> {
46 let file_descriptor_set = build_file_descriptor_set(request).await?;
47
48 let pool = DescriptorPool::from_file_descriptor_set(file_descriptor_set)
49 .map_err(|e| Error::Internal(format!("err {e}")))?;
50
51 Ok(Self { pool })
52 }
53
54 #[must_use]
56 pub fn get_service_by_name(&self, name: &str) -> Option<ServiceDescriptor> {
57 self.pool.get_service_by_name(name)
58 }
59
60 #[must_use]
62 pub fn get_message_by_name(&self, name: &str) -> Option<MessageDescriptor> {
63 self.pool.get_message_by_name(name)
64 }
65
66 #[must_use]
68 pub fn get_method_by_name(
69 &self,
70 service_name: &str,
71 method_name: &str,
72 ) -> Option<MethodDescriptor> {
73 self.get_service_by_name(service_name)?
74 .methods()
75 .find(|m| m.name() == method_name)
76 }
77
78 #[must_use]
80 pub fn get_services(&self) -> Vec<ServiceDescriptor> {
81 let mut services: Vec<ServiceDescriptor> = self.pool.services().collect();
82 services.sort_by(|a, b| a.full_name().cmp(b.full_name()));
83 services
84 }
85 #[must_use]
87 pub fn get_methods(&self, service: &ServiceDescriptor) -> Vec<MethodDescriptor> {
88 let mut methods: Vec<MethodDescriptor> = service.methods().collect();
89 methods.sort_by(|a, b| a.full_name().cmp(b.full_name()));
90 methods
91 }
92
93 #[must_use]
95 pub fn get_request_descriptor(&self, method: &MethodDescriptor) -> MessageDescriptor {
96 method.input()
97 }
98
99 #[must_use]
101 pub fn get_response_descriptor(&self, method: &MethodDescriptor) -> MessageDescriptor {
102 method.output()
103 }
104
105 #[must_use]
107 pub fn get_request(&self, method: &MethodDescriptor) -> RequestMessage {
108 RequestMessage::new(self.get_request_descriptor(method), method.clone())
109 }
110
111 #[must_use]
113 pub fn get_response(&self, method: &MethodDescriptor) -> ResponseMessage {
114 ResponseMessage::new(self.get_response_descriptor(method), method.clone())
115 }
116}