use super::{GrancClient, Offline};
use crate::client::{OfflineReflectionState, types::Descriptor};
use prost_reflect::{DescriptorError, DescriptorPool};
impl GrancClient<Offline> {
pub fn offline(file_descriptor: Vec<u8>) -> Result<Self, DescriptorError> {
let pool = DescriptorPool::decode(file_descriptor.as_slice())?;
Ok(GrancClient::new(Offline::new(pool)))
}
}
impl<T> GrancClient<T>
where
T: OfflineReflectionState,
{
pub fn list_services(&self) -> Vec<String> {
self.state
.descriptor_pool()
.services()
.map(|s| s.full_name().to_string())
.collect()
}
pub fn get_descriptor_by_symbol(&self, symbol: &str) -> Option<Descriptor> {
let pool = self.state.descriptor_pool();
if let Some(descriptor) = pool.get_service_by_name(symbol) {
return Some(Descriptor::ServiceDescriptor(descriptor));
}
if let Some(descriptor) = pool.get_message_by_name(symbol) {
return Some(Descriptor::MessageDescriptor(descriptor));
}
if let Some(descriptor) = pool.get_enum_by_name(symbol) {
return Some(Descriptor::EnumDescriptor(descriptor));
}
None
}
}