16d93c1d0Stottoto use std::{
26d93c1d0Stottoto fs::File,
36d93c1d0Stottoto io::{BufWriter, Write as _},
46d93c1d0Stottoto path::{Path, PathBuf},
56d93c1d0Stottoto };
66d93c1d0Stottoto
71470dfb9Stottoto use protox::prost::Message as _;
81470dfb9Stottoto use quote::quote;
96d93c1d0Stottoto use tonic_build::FileDescriptorSet;
1044aa46dbStottoto
main()1144aa46dbStottoto fn main() {
1244aa46dbStottoto // tonic-health
1344aa46dbStottoto codegen(
1444aa46dbStottoto &PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
1544aa46dbStottoto .parent()
1644aa46dbStottoto .unwrap()
1744aa46dbStottoto .join("tonic-health"),
1844aa46dbStottoto &["proto/health.proto"],
1944aa46dbStottoto &["proto"],
2044aa46dbStottoto &PathBuf::from("src/generated"),
211470dfb9Stottoto &PathBuf::from("src/generated/grpc_health_v1_fds.rs"),
2244aa46dbStottoto true,
2344aa46dbStottoto true,
2444aa46dbStottoto );
2544aa46dbStottoto
2644aa46dbStottoto // tonic-reflection
2744aa46dbStottoto codegen(
2844aa46dbStottoto &PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
2944aa46dbStottoto .parent()
3044aa46dbStottoto .unwrap()
3144aa46dbStottoto .join("tonic-reflection"),
32b29f4668Skatelyn martin &["proto/reflection_v1.proto"],
33b29f4668Skatelyn martin &["proto"],
34b29f4668Skatelyn martin &PathBuf::from("src/generated"),
351470dfb9Stottoto &PathBuf::from("src/generated/reflection_v1_fds.rs"),
36b29f4668Skatelyn martin true,
37b29f4668Skatelyn martin true,
38b29f4668Skatelyn martin );
39b29f4668Skatelyn martin codegen(
40b29f4668Skatelyn martin &PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
41b29f4668Skatelyn martin .parent()
42b29f4668Skatelyn martin .unwrap()
43b29f4668Skatelyn martin .join("tonic-reflection"),
44b29f4668Skatelyn martin &["proto/reflection_v1alpha.proto"],
4544aa46dbStottoto &["proto"],
4644aa46dbStottoto &PathBuf::from("src/generated"),
471470dfb9Stottoto &PathBuf::from("src/generated/reflection_v1alpha1_fds.rs"),
4844aa46dbStottoto true,
4944aa46dbStottoto true,
5044aa46dbStottoto );
5144aa46dbStottoto
5244aa46dbStottoto // tonic-types
5344aa46dbStottoto codegen(
5444aa46dbStottoto &PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
5544aa46dbStottoto .parent()
5644aa46dbStottoto .unwrap()
5744aa46dbStottoto .join("tonic-types"),
5844aa46dbStottoto &["proto/status.proto", "proto/error_details.proto"],
5944aa46dbStottoto &["proto"],
6044aa46dbStottoto &PathBuf::from("src/generated"),
611470dfb9Stottoto &PathBuf::from("src/generated/types_fds.rs"),
6244aa46dbStottoto false,
6344aa46dbStottoto false,
6444aa46dbStottoto );
6544aa46dbStottoto }
6644aa46dbStottoto
codegen( root_dir: &Path, iface_files: &[&str], include_dirs: &[&str], out_dir: &Path, file_descriptor_set_path: &Path, build_client: bool, build_server: bool, )6744aa46dbStottoto fn codegen(
68522a8d74Stottoto root_dir: &Path,
6944aa46dbStottoto iface_files: &[&str],
7044aa46dbStottoto include_dirs: &[&str],
71522a8d74Stottoto out_dir: &Path,
72522a8d74Stottoto file_descriptor_set_path: &Path,
7344aa46dbStottoto build_client: bool,
7444aa46dbStottoto build_server: bool,
7544aa46dbStottoto ) {
767b2b0eeaStottoto let tempdir = tempfile::Builder::new()
777b2b0eeaStottoto .prefix("tonic-codegen-")
787b2b0eeaStottoto .tempdir()
797b2b0eeaStottoto .unwrap();
807b2b0eeaStottoto
81*6856ffe3Stottoto let iface_files = iface_files.iter().map(|&path| root_dir.join(path));
82*6856ffe3Stottoto let include_dirs = include_dirs.iter().map(|&path| root_dir.join(path));
8344aa46dbStottoto let out_dir = root_dir.join(out_dir);
8444aa46dbStottoto let file_descriptor_set_path = root_dir.join(file_descriptor_set_path);
8544aa46dbStottoto
86*6856ffe3Stottoto let fds = protox::compile(iface_files, include_dirs).unwrap();
876d93c1d0Stottoto
886d93c1d0Stottoto write_fds(&fds, &file_descriptor_set_path);
896d93c1d0Stottoto
9044aa46dbStottoto tonic_build::configure()
9144aa46dbStottoto .build_client(build_client)
9244aa46dbStottoto .build_server(build_server)
937b2b0eeaStottoto .out_dir(&tempdir)
946d93c1d0Stottoto .compile_fds(fds)
9544aa46dbStottoto .unwrap();
967b2b0eeaStottoto
977b2b0eeaStottoto for path in std::fs::read_dir(tempdir.path()).unwrap() {
987b2b0eeaStottoto let path = path.unwrap().path();
997b2b0eeaStottoto let to = out_dir.join(
1007b2b0eeaStottoto path.file_name()
1017b2b0eeaStottoto .unwrap()
1027b2b0eeaStottoto .to_str()
1037b2b0eeaStottoto .unwrap()
1047b2b0eeaStottoto .strip_suffix(".rs")
1057b2b0eeaStottoto .unwrap()
1067b2b0eeaStottoto .replace('.', "_")
1077b2b0eeaStottoto + ".rs",
1087b2b0eeaStottoto );
1097b2b0eeaStottoto std::fs::copy(&path, &to).unwrap();
1107b2b0eeaStottoto }
11144aa46dbStottoto }
1126d93c1d0Stottoto
write_fds(fds: &FileDescriptorSet, path: &Path)1136d93c1d0Stottoto fn write_fds(fds: &FileDescriptorSet, path: &Path) {
1141470dfb9Stottoto const GENERATED_COMMENT: &str = "// This file is @generated by codegen.";
1151470dfb9Stottoto
1161470dfb9Stottoto let mut fds = fds.clone();
1171470dfb9Stottoto for fd in fds.file.iter_mut() {
1181470dfb9Stottoto fd.source_code_info = None;
1191470dfb9Stottoto }
1201470dfb9Stottoto
1211470dfb9Stottoto let fds_raw = fds.encode_to_vec();
1221470dfb9Stottoto let tokens = quote! {
1231470dfb9Stottoto /// Byte encoded FILE_DESCRIPTOR_SET.
1241470dfb9Stottoto pub const FILE_DESCRIPTOR_SET: &[u8] = &[#(#fds_raw),*];
1251470dfb9Stottoto };
1261470dfb9Stottoto let ast = syn::parse2(tokens).unwrap();
1271470dfb9Stottoto let formatted = prettyplease::unparse(&ast);
1281470dfb9Stottoto
1291470dfb9Stottoto let content = format!("{GENERATED_COMMENT}\n{formatted}");
1301470dfb9Stottoto
1316d93c1d0Stottoto let mut writer = BufWriter::new(File::create(path).unwrap());
1321470dfb9Stottoto writer.write_all(content.as_bytes()).unwrap();
1336d93c1d0Stottoto }
134