use anyhow::Result; /* use std::{env::current_dir, fs::{read_dir, remove_file, write}, path::PathBuf}; use regex::Regex; const RUST_FILE_NAME_REGEX: &str = r"^.*\.rs$"; const EMPTY_FILE_NEEDING_DELETION_FILENAME: &str = "google.protobuf.rs"; const MOD_FILENAME: &str = "mod.rs"; */ fn main() -> Result<()> { // NOTE: This function generates Rust Protobuf bindings pre-compilation // We have it disabled as of 2021-02-10 due to https://github.com/kurtosis-tech/kurtosis-libs/issues/22 /* let current_dirpath = current_dir() .context("Couldn't get current directory")?; let root_dirpath = current_dirpath.join("../.."); let root_dirpath = root_dirpath.canonicalize() .context(format!("An error occurred canonicalizing root dirpath {}", root_dirpath.display()))?; let protos_dirpath = root_dirpath.join("core-api"); let protos_dirpath = protos_dirpath.canonicalize() .context(format!("An error occurred canonicalizing .proto dirpath '{}'", protos_dirpath.display()))?; let input_dir_entries = read_dir(&protos_dirpath) .context(format!("An error occurred reading the files in .proto dirpath '{}'", protos_dirpath.display()))?; let mut proto_filepaths: Vec = Vec::new(); for (idx, dir_entry_result) in input_dir_entries.enumerate() { let dir_entry = dir_entry_result .context(format!("An error occurred unwrapping .proto filepath at idx '{}'", idx))?; let metadata = dir_entry.metadata() .context(format!("Could not get metadata for dir entry '{}'", dir_entry.path().display()))?; if metadata.is_file() { println!("cargo:rerun-if-changed={}", dir_entry.path().display()); proto_filepaths.push(dir_entry.path()); } } let out_dirpath = current_dirpath.join("src/core_api_bindings"); let out_dirpath = out_dirpath.canonicalize() .context(format!("An error occurred canonicalizing output dirpath '{}'", out_dirpath.display()))?; let output_dir_entries = read_dir(&out_dirpath) .context(format!("An error occurred reading the files in output dirpath '{}'", out_dirpath.display()))?; let rust_file_pattern = Regex::new(RUST_FILE_NAME_REGEX) .context(format!("An error occurred compiling Rust filename pattern '{}'", RUST_FILE_NAME_REGEX))?; for (idx, dir_entry_result) in output_dir_entries.enumerate() { let dir_entry = dir_entry_result .context(format!("An error occurred unwrapping dir entry in output dirpath at idx '{}'", idx))?; let metadata = dir_entry.metadata() .context(format!("Could not get metadata for dir entry '{}'", dir_entry.path().display()))?; let filename = dir_entry.file_name(); let filename_unicode = filename.to_str() .context(format!("Could not convert file name of path '{}' to a Unicode string", dir_entry.path().display()))?; let is_rust_file = rust_file_pattern.is_match(filename_unicode); if metadata.is_file() && is_rust_file { remove_file(dir_entry.path()) .context(format!( "An error occurred removing output directory file '{}'", dir_entry.path().display(), ))?; } } // NOTE: We have to do the Protobuf binding generation here, rather than in the "regenerate-protobufs" Bash script, // because we're using Tonic/Prost, which is only a Rust library (doesn't have a `protoc` plugin). The grpc-protobuf crate // does have a `protoc` plugin, but it's not maintained frequently so we don't use it tonic_build::configure() .out_dir(&out_dirpath) .compile(&proto_filepaths, &[protos_dirpath]) .context("An error occurred generating the .proto files")?; // Due to https://github.com/danburkert/prost/issues/228, we get an empty file named "google.protobuf.rs" that // needs to be deleted after every build let empty_file_filepath = out_dirpath.join(EMPTY_FILE_NEEDING_DELETION_FILENAME).canonicalize() .context("An error occurred canonicalizing the full path of empty file needing deletion")?; remove_file(&empty_file_filepath) .context(format!("Failed to remove empty file '{}'", empty_file_filepath.display()))?; // Get list of modules generated... let output_dir_entries = read_dir(&out_dirpath) .context(format!("An error occurred reading the files in output dirpath '{}'", out_dirpath.display()))?; let mut mod_file_lines: Vec = Vec::new(); for (idx, dir_entry_result) in output_dir_entries.enumerate() { let dir_entry = dir_entry_result .context(format!("An error occurred unwrapping generated dir entry in output dirpath at idx '{}'", idx))?; let dir_entry_path = dir_entry.path(); let metadata = dir_entry.metadata() .context(format!("Could not get metadata for generated dir entry '{}'", dir_entry_path.display()))?; let filename = dir_entry.file_name(); let filename_unicode = filename.to_str() .context(format!("Could not convert file name of path '{}' to a Unicode string", dir_entry_path.display()))?; let is_rust_file = rust_file_pattern.is_match(filename_unicode); if metadata.is_file() && is_rust_file { let filename_without_ext_osstr = dir_entry_path.file_stem() .context("Failed to get filename without extension for file ")?; let filename_without_ext_str = filename_without_ext_osstr.to_str() .context(format!("Could not convert OsString for file '{}' to regular string", dir_entry_path.display()))?; mod_file_lines.push( format!("pub mod {};", filename_without_ext_str) ); } } // ...and write those modules to a mod.rs file let mod_filepath = out_dirpath.join(MOD_FILENAME); let data = mod_file_lines.join("\n"); write(&mod_filepath, data) .context(format!("Failed to write modules to {} file", MOD_FILENAME))?; */ Ok(()) }