use std::env;
use std::fs::create_dir_all;
use std::path::{Path, PathBuf};
use prost::Message;
use prost_types::FileDescriptorSet;
fn main() {
#[cfg(feature = "vendored-protoc")]
std::env::set_var("PROTOC", protobuf_src::protoc());
let dir = PathBuf::from(env::var("OUT_DIR").unwrap());
build(&dir, "pbtime");
build(&dir, "pbstruct");
build(&dir, "pbany");
build(&dir, "pbempty");
build(&dir, "pbmask");
}
fn build(dir: &Path, proto: &str) {
let out = dir.join(proto);
create_dir_all(&out).unwrap();
let source = format!("proto/{proto}.proto");
let descriptor_file = out.join("descriptors.bin");
let mut prost_build = prost_build::Config::new();
#[cfg(feature = "vendored-protox")]
{
let file_descriptors = protox::compile([source.clone()], ["proto/".to_string()]).unwrap();
std::fs::write(&descriptor_file, file_descriptors.encode_to_vec()).unwrap();
prost_build.skip_protoc_run();
}
prost_build
.compile_well_known_types()
.type_attribute("google.protobuf.Empty","#[derive(serde_derive::Serialize, serde_derive::Deserialize)]")
.type_attribute("google.protobuf.FieldMask","#[derive(serde_derive::Serialize, serde_derive::Deserialize)]")
.file_descriptor_set_path(&descriptor_file)
.out_dir(&out)
.compile_protos(
&[
source
],
&["proto/".to_string()],
)
.unwrap();
let descriptor_bytes = std::fs::read(descriptor_file).unwrap();
let descriptor = FileDescriptorSet::decode(&descriptor_bytes[..]).unwrap();
prost_wkt_build::add_serde(out, descriptor);
}