xref: /tonic/codegen/src/main.rs (revision 6856ffe3)
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