use std::path::PathBuf; pub trait BuildConfigTrait { fn getpath_gcc(&self) -> String; fn getpath_gpp(&self) -> String; fn getpath_src(&self) -> String; fn getpath_target_o(&self) -> String; fn get_project_name(&self) -> &str; fn getpath_target_bin(&self) -> String; fn getpath_target_file(&self) -> String; fn get_extra_final_args(&self) -> &Vec; fn need_run(&self) -> bool; } #[derive(Debug)] pub struct BuildConfig { compiler_path: Option, project_path: PathBuf, project_name: String, extra_final_args: Vec, need_run: bool, } impl BuildConfig { pub fn new( compiler_path: Option, project_name: String, release: bool, run: bool, ) -> Self { let project_path = std::env::current_dir().unwrap(); let mut extra = Vec::new(); if release { extra.push(String::from("-O3")); } Self { compiler_path, project_path, project_name, extra_final_args: extra, need_run: run, } } } impl BuildConfigTrait for BuildConfig { fn getpath_gcc(&self) -> String { return self.getpath_gpp(); // 此处需要修改 } fn getpath_gpp(&self) -> String { let t = self.compiler_path.clone(); match t { Some(str) => String::from(PathBuf::from(str).join("bin").join("g++").to_str().unwrap()), None => String::from("g++"), } } fn getpath_src(&self) -> String { String::from(self.project_path.clone().join("src").to_str().unwrap()) } fn getpath_target_o(&self) -> String { String::from( self.project_path .clone() .join("target") .join("o") .to_str() .unwrap(), ) } fn get_project_name(&self) -> &str { &self.project_name } fn getpath_target_bin(&self) -> String { String::from( self.project_path .clone() .join("target") .join("bin") .to_str() .unwrap(), ) } fn getpath_target_file(&self) -> String { let file_name = super::utils::make_app_file_name(self.get_project_name()); let ans = PathBuf::from(self.getpath_target_bin()).join(file_name); String::from(ans.to_str().unwrap()) } fn get_extra_final_args(&self) -> &Vec { return &self.extra_final_args; } fn need_run(&self) -> bool { return self.need_run; } }