cup-cli 0.1.6

A Cargo-like tool for C++ Project Building and Package Management
Documentation
use std::path::Path;

use crate::config::{Language, LanguageConfig, Shelling, Table, TableConfig};

#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct BuildConfig {
    pub jobs: Option<usize>,
    pub languages: Option<LanguageConfig>,
    pub debug: Option<TableConfig>,
    pub release: Option<TableConfig>,
}

impl<P: AsRef<Path>> Shelling<anyhow::Result<Build>, P> for BuildConfig {
    fn shelling(self, base: P) -> anyhow::Result<Build> {
        Ok(Build {
            jobs: self
                .jobs
                .map(|th| {
                    if th == 0 {
                        let cpus = std::thread::available_parallelism();
                        if let Ok(cpus) = cpus { cpus.get() } else { 1 }
                    } else {
                        th
                    }
                })
                .unwrap_or(1),
            languages: self.languages.unwrap_or_default().shelling(&base),
            debug: self.debug.unwrap_or_default().shelling(&base)?,
            release: self.release.unwrap_or_default().shelling(&base)?,
        })
    }
}

#[derive(Debug, Clone)]
pub struct Build {
    pub jobs: usize,
    pub languages: Language,
    pub debug: Table,
    pub release: Table,
}