1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use crate::Skeleton; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::process::Command; #[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)] pub struct Recipe { pub skeleton: Skeleton, } impl Recipe { pub fn prepare(base_path: PathBuf) -> Result<Self, anyhow::Error> { let skeleton = Skeleton::derive(&base_path)?; Ok(Recipe { skeleton }) } pub fn cook(&self, profile: OptimisationProfile) -> Result<(), anyhow::Error> { self.skeleton.build_minimum_project()?; build_dependencies(profile); let current_directory = std::env::current_dir()?; self.skeleton .remove_compiled_dummy_libraries(current_directory, profile)?; Ok(()) } } #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum OptimisationProfile { Release, Debug, } fn build_dependencies(profile: OptimisationProfile) { let mut command = Command::new("cargo"); let command_with_args = command.arg("build"); let command_with_args = match profile { OptimisationProfile::Release => command_with_args.arg("--release"), OptimisationProfile::Debug => command_with_args, }; execute_command(command_with_args); } fn execute_command(command: &mut Command) { let mut child = command .envs(std::env::vars()) .spawn() .expect("Failed to execute process"); let exit_status = child.wait().expect("Failed to run command"); if !exit_status.success() { match exit_status.code() { Some(code) => panic!("Exited with status code: {}", code), None => panic!("Process terminated by signal"), } } }