use serde::{Deserialize, Serialize};
use crate::{party_command::PartyCommand, util::OptionEnv};
#[derive(Serialize, Deserialize, Debug)]
pub struct Task {
pub command: String,
pub parallel: Option<bool>,
pub env: OptionEnv,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Tasks {
pub tasks: Vec<Task>,
}
impl From<PartyCommand> for Task {
fn from(value: PartyCommand) -> Self {
let parallel = value.is_parallel.then_some(true);
Self {
command: value.command,
env: value.env,
parallel,
}
}
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
use super::Tasks;
#[test]
fn test_parse_toml() {
let toml = "
[[tasks]]
command = \"cargo fmt\"
parallel = false
[[tasks]]
command = \"cargo clippy -- -Dwarnings\"
parallel = true
env = {}
[[tasks]]
env = { VAR = \"test\" }
command = \"cargo test\"
";
let tasks: Result<Tasks, toml::de::Error> = toml::from_str(&toml);
assert!(tasks.is_ok());
let tasks = tasks.unwrap();
assert_eq!(tasks.tasks.len(), 3);
assert_eq!(tasks.tasks[0].command, "cargo fmt");
assert!(tasks.tasks[0].parallel.is_some_and(|x| !x));
assert!(tasks.tasks[0].env.is_none());
assert_eq!(tasks.tasks[1].command, "cargo clippy -- -Dwarnings");
assert!(tasks.tasks[1].parallel.is_some_and(|x| x));
assert_eq!(tasks.tasks[1].env, Some(HashMap::new()));
assert_eq!(tasks.tasks[2].command, "cargo test");
assert!(tasks.tasks[2].parallel.is_none());
let mut expected_env = HashMap::new();
expected_env.insert("VAR".to_string(), "test".to_string());
assert_eq!(tasks.tasks[2].env, Some(expected_env))
}
}