risingwave_connector_codec/common/protobuf/
compiler.rsuse std::collections::HashMap;
use prost_types::FileDescriptorSet;
use protox::file::{ChainFileResolver, File, FileResolver, GoogleFileResolver};
use protox::Error;
pub fn compile_pb(
main_file: (String, String),
dependencies: impl IntoIterator<Item = (String, String)>,
) -> Result<FileDescriptorSet, Error> {
struct MyResolver {
map: HashMap<String, String>,
}
impl MyResolver {
fn new(
main_file: (String, String),
dependencies: impl IntoIterator<Item = (String, String)>,
) -> Self {
let map = std::iter::once(main_file).chain(dependencies).collect();
Self { map }
}
}
impl FileResolver for MyResolver {
fn open_file(&self, name: &str) -> Result<File, Error> {
if let Some(content) = self.map.get(name) {
Ok(File::from_source(name, content)?)
} else {
Err(Error::file_not_found(name))
}
}
}
let main_file_name = main_file.0.clone();
let mut resolver = ChainFileResolver::new();
resolver.add(GoogleFileResolver::new());
resolver.add(MyResolver::new(main_file, dependencies));
let fd = protox::Compiler::with_file_resolver(resolver)
.include_imports(true)
.open_file(&main_file_name)?
.file_descriptor_set();
Ok(fd)
}