vrl/protobuf/
descriptor.rs1use prost_reflect::{DescriptorPool, MessageDescriptor};
2use std::path::Path;
3
4pub fn get_message_descriptor(
5 descriptor_set_path: &Path,
6 message_type: &str,
7) -> Result<MessageDescriptor, String> {
8 let bytes = std::fs::read(descriptor_set_path)
9 .map_err(|e| format!("Failed to open protobuf desc file '{descriptor_set_path:?}': {e}"))?;
10 let pool = DescriptorPool::decode(bytes.as_slice()).map_err(|e| {
11 format!("Failed to parse protobuf desc file '{descriptor_set_path:?}': {e}")
12 })?;
13 resolve_message_descriptor(
14 pool,
15 message_type,
16 &format!("'{}'", descriptor_set_path.display()),
17 )
18}
19
20pub fn get_message_descriptor_from_bytes(
21 descriptor_bytes: &[u8],
22 message_type: &str,
23) -> Result<MessageDescriptor, String> {
24 let pool = DescriptorPool::decode(descriptor_bytes)
25 .map_err(|e| format!("Failed to parse protobuf descriptor bytes: {e}"))?;
26 resolve_message_descriptor(pool, message_type, "the provided descriptor bytes")
27}
28
29fn resolve_message_descriptor(
30 descriptor_pool: DescriptorPool,
31 message_type: &str,
32 context: &str,
33) -> Result<MessageDescriptor, String> {
34 descriptor_pool
35 .get_message_by_name(message_type)
36 .ok_or_else(|| format!("The message type '{message_type}' could not be found in {context}"))
37}