1use std::path::PathBuf;
2
3use serde::Deserialize;
4
5use crate::common::{
6 target_arch::TargetArch,
7 task::{BuildConfig, CleanConfig, Dependency, InstallConfig, TaskEnv, TaskSource},
8};
9
10use anyhow::Result;
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13pub enum UserCleanLevel {
14 All,
16 InSrc,
18 Output,
20}
21
22#[derive(Debug, Deserialize, PartialEq)]
23pub struct UserConfigFile {
25 pub name: String,
27 pub version: String,
29 pub description: String,
31 #[serde(rename = "task-source")]
33 pub task_source: TaskSource,
34 #[serde(default = "default_empty_dep")]
36 pub depends: Vec<Dependency>,
37 pub build: BuildConfig,
39 pub install: InstallConfig,
41 pub clean: CleanConfig,
43 #[serde(default = "default_empty_env")]
45 pub envs: Vec<TaskEnv>,
46
47 #[serde(rename = "build-once", default = "default_false")]
49 pub build_once: bool,
50
51 #[serde(rename = "install-once", default = "default_false")]
53 pub install_once: bool,
54
55 #[serde(rename = "target-arch")]
56 pub target_arch: Vec<TargetArch>,
57}
58
59impl UserConfigFile {
60 pub fn load(path: &PathBuf) -> Result<Self> {
61 let content = std::fs::read_to_string(path)?;
62 Self::load_from_str(&content)
63 }
64
65 pub fn load_from_str(content: &str) -> Result<Self> {
66 let config: UserConfigFile = toml::from_str(content)?;
67 Ok(config)
68 }
69}
70
71fn default_empty_env() -> Vec<TaskEnv> {
72 vec![]
73}
74
75fn default_empty_dep() -> Vec<Dependency> {
76 vec![]
77}
78
79fn default_false() -> bool {
80 false
81}