vrl/protobuf/
descriptor.rs

1use 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}