#![forbid(unsafe_code)]
pub mod builder;
pub mod compile_str;
pub mod error;
pub mod parser;
pub use builder::Builder;
pub use compile_str::compile_str as compile_str_fn;
pub use error::BuildError;
pub use compile_str::compile_str;
use std::path::Path;
pub fn compile_protos(
protos: &[impl AsRef<Path>],
includes: &[impl AsRef<Path>],
) -> Result<(), oxiproto_core::OxiProtoError> {
Builder::new()
.compile(protos, includes)
.map_err(oxiproto_core::OxiProtoError::from)
}
pub fn compile_to_fds(
protos: &[impl AsRef<Path>],
includes: &[impl AsRef<Path>],
) -> Result<prost_types::FileDescriptorSet, oxiproto_core::OxiProtoError> {
Builder::new()
.compile_to_fds(protos, includes)
.map_err(oxiproto_core::OxiProtoError::from)
}
#[cfg(feature = "native-parser")]
pub fn compile_str_native(
proto_source: &str,
) -> Result<prost_types::FileDescriptorSet, BuildError> {
use crate::parser::{build_file_descriptor_set, parse_file, resolve};
let proto_file = parse_file(proto_source).map_err(|e| BuildError::Parse {
file: "<inline>.proto".to_owned(),
line: 0,
col: 0,
message: e.to_string(),
})?;
if !proto_file.imports.is_empty() {
return Err(BuildError::Parse {
file: "<inline>.proto".to_owned(),
line: 0,
col: 0,
message:
"imports are not supported in compile_str_native; use compile_files_native instead"
.to_owned(),
});
}
let resolved = resolve(&proto_file).map_err(|e| BuildError::Parse {
file: "<inline>.proto".to_owned(),
line: 0,
col: 0,
message: e.to_string(),
})?;
Ok(build_file_descriptor_set(
&resolved,
"<inline>.proto",
proto_source,
))
}
#[cfg(feature = "native-parser")]
pub fn compile_files_native(
protos: &[impl AsRef<std::path::Path>],
includes: &[impl AsRef<std::path::Path>],
) -> Result<prost_types::FileDescriptorSet, BuildError> {
let inc: Vec<std::path::PathBuf> = includes.iter().map(|p| p.as_ref().to_path_buf()).collect();
parser::loader::compile_files(protos, &inc)
}