1use std::path::Path;
2
3use crate::config::{Language, LanguageConfig, Shelling, Table, TableConfig};
4
5#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
6pub struct BuildConfig {
7 pub jobs: Option<usize>,
8 pub languages: Option<LanguageConfig>,
9 pub debug: Option<TableConfig>,
10 pub release: Option<TableConfig>,
11}
12
13impl<P: AsRef<Path>> Shelling<anyhow::Result<Build>, P> for BuildConfig {
14 fn shelling(self, base: P) -> anyhow::Result<Build> {
15 Ok(Build {
16 jobs: self
17 .jobs
18 .map(|th| {
19 if th == 0 {
20 let cpus = std::thread::available_parallelism();
21 if let Ok(cpus) = cpus { cpus.get() } else { 1 }
22 } else {
23 th
24 }
25 })
26 .unwrap_or(1),
27 languages: self.languages.unwrap_or_default().shelling(&base),
28 debug: self.debug.unwrap_or_default().shelling(&base)?,
29 release: self.release.unwrap_or_default().shelling(&base)?,
30 })
31 }
32}
33
34#[derive(Debug, Clone)]
35pub struct Build {
36 pub jobs: usize,
37 pub languages: Language,
38 pub debug: Table,
39 pub release: Table,
40}