// Protocol Buffers - Google's data interchange format // Copyright 2025 Google LLC. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd use protobuf_codegen::{CodeGen, Dependency}; use std::path::Path; use std::path::PathBuf; // Given "a/b/c.proto", returns "c". fn short_name(proto_file_name: &str) -> String { proto_file_name.rsplit('/').next().unwrap().strip_suffix(".proto").unwrap().to_string() } fn main() { // All proto files needed for testing, grouped by protoc invocation. let proto_files = vec![ vec!["rust/test/bad_names.proto".to_string()], vec!["rust/test/bad_names.proto".to_string()], vec!["rust/test/child.proto".to_string()], vec!["google/protobuf/cpp_features.proto".to_string()], vec!["google/protobuf/descriptor.proto".to_string()], vec!["rust/test/dots_in_package.proto".to_string()], vec!["rust/test/edition2023.proto".to_string()], vec!["rust/test/enums.proto".to_string()], vec!["rust/test/fields_with_imported_types.proto".to_string()], vec!["rust/test/imported_types.proto".to_string()], vec!["rust/test/import_public_grandparent.proto".to_string()], vec!["rust/test/import_public_non_primary_src1.proto".to_string()], vec!["rust/test/import_public_non_primary_src2.proto".to_string()], vec!["rust/test/import_public_primary_src.proto".to_string()], vec![ "rust/test/import_public.proto".to_string(), "rust/test/import_public2.proto".to_string(), ], vec!["rust/test/map_unittest.proto".to_string()], vec!["rust/test/nested.proto".to_string()], vec!["rust/test/no_package_import.proto".to_string()], vec![ "rust/test/no_package.proto".to_string(), "rust/test/no_package_other.proto".to_string(), ], vec!["rust/test/package_disabiguation1.proto".to_string()], vec!["rust/test/package_disabiguation2.proto".to_string()], vec!["rust/test/package_import.proto".to_string()], vec![ "rust/test/package.proto".to_string(), "rust/test/package_other.proto".to_string(), "rust/test/package_other_different.proto".to_string(), ], vec!["rust/test/parent.proto".to_string()], vec!["rust/test/srcsless_library_test_child.proto".to_string()], vec!["rust/test/srcsless_library_test_parent.proto".to_string()], vec!["rust/test/unittest_import.proto".to_string()], vec!["rust/test/unittest.proto".to_string()], vec!["rust/test/unittest_proto3_optional.proto".to_string()], vec!["rust/test/unittest_proto3.proto".to_string()], vec!["rust/test/bad_names.proto".to_string()], vec!["rust/test/child.proto".to_string()], vec!["google/protobuf/cpp_features.proto".to_string()], vec!["google/protobuf/descriptor.proto".to_string()], vec!["rust/test/dots_in_package.proto".to_string()], vec!["rust/test/edition2023.proto".to_string()], vec!["rust/test/enums.proto".to_string()], vec!["rust/test/fields_with_imported_types.proto".to_string()], vec!["rust/test/imported_types.proto".to_string()], vec!["rust/test/import_public_grandparent.proto".to_string()], vec!["rust/test/import_public_non_primary_src1.proto".to_string()], vec!["rust/test/import_public_non_primary_src2.proto".to_string()], vec!["rust/test/import_public_primary_src.proto".to_string()], vec![ "rust/test/import_public.proto".to_string(), "rust/test/import_public2.proto".to_string(), ], vec!["rust/test/map_unittest.proto".to_string()], vec!["rust/test/nested.proto".to_string()], vec!["rust/test/no_package_import.proto".to_string()], vec![ "rust/test/no_package.proto".to_string(), "rust/test/no_package_other.proto".to_string(), ], vec!["rust/test/package_disabiguation1.proto".to_string()], vec!["rust/test/package_disabiguation2.proto".to_string()], vec!["rust/test/package_import.proto".to_string()], vec![ "rust/test/package.proto".to_string(), "rust/test/package_other.proto".to_string(), "rust/test/package_other_different.proto".to_string(), ], vec!["rust/test/parent.proto".to_string()], vec!["rust/test/srcsless_library_test_child.proto".to_string()], vec!["rust/test/srcsless_library_test_parent.proto".to_string()], vec!["rust/test/unittest_import.proto".to_string()], vec!["rust/test/unittest.proto".to_string()], vec!["rust/test/unittest_proto3_optional.proto".to_string()], vec!["rust/test/unittest_proto3.proto".to_string()], ]; let mut deps: Vec = vec![]; for target in &proto_files { let name = short_name(&target[0]); deps.push(Dependency { crate_name: format!("crate::protos::{name}_rust_proto"), proto_import_paths: vec![Path::new(env!("CARGO_MANIFEST_DIR")).join("proto")], proto_files: target.to_vec(), }); } for target in proto_files { let name = short_name(&target[0]); CodeGen::new() .inputs(target) .dependency(deps.clone()) .output_dir( PathBuf::from(std::env::var("OUT_DIR").unwrap()) .join(format!("protobuf_generated/{name}")), ) .include("proto") .generate_and_compile() .unwrap(); } }