use std::env; use std::io::Result; use std::path::Path; use config::{Config, File}; fn main() -> Result<()> { let cargo_manifest_dir_var_name = "CARGO_MANIFEST_DIR"; let cargo_manifest_dir = env::var(cargo_manifest_dir_var_name).unwrap_or_else( |_| panic!("${} is not set", cargo_manifest_dir_var_name) ); let config_location = format!("{}/definition_paths.toml", cargo_manifest_dir); let config = Config::builder() .add_source(File::with_name(config_location.as_str())) .build() .unwrap_or_else( |_| panic!("Could not read config at {}", config_location) ); let env_table = config.get_table("definition").unwrap(); let definition_dir_prod_var_name = "DEFINITION_DIR_PROD"; let relative_definition_dir_prod = env_table.get(definition_dir_prod_var_name).unwrap_or_else( || panic!("Could not read setting {}", definition_dir_prod_var_name) ); let mut path_to_definition = format!( "{}/{}", cargo_manifest_dir, relative_definition_dir_prod ); if !Path::new(&path_to_definition).exists() { let definition_dir_dev_var_name = "DEFINITION_DIR_DEV"; let relative_definition_dir_dev = env_table.get(definition_dir_dev_var_name).unwrap_or_else( || panic!("Could not read setting {}", definition_dir_dev_var_name) ); path_to_definition = format!( "{}/{}", cargo_manifest_dir, relative_definition_dir_dev ); } prost_build::compile_protos( &[format!("{}/instruction_serialiser.proto", path_to_definition)], &[path_to_definition] )?; Ok(()) }