party_run/parser/
toml_command.rs

1//! Structs used by the parser to parse the TOML components.
2use serde::{Deserialize, Serialize};
3
4use crate::party_command::PartyCommand;
5
6/// Single TOML task
7#[derive(Serialize, Deserialize, Debug)]
8pub struct Task {
9    /// Command components
10    pub command: Vec<String>,
11
12    /// Signals if command can be paralelised
13    pub parallel: Option<bool>,
14}
15
16/// Top-level struct holding all TOML tasks
17#[derive(Serialize, Deserialize, Debug)]
18pub struct Tasks {
19    /// Parsed tasks
20    pub tasks: Vec<Task>,
21}
22
23impl From<PartyCommand> for Task {
24    fn from(mut value: PartyCommand) -> Self {
25        let mut command = vec![value.command];
26        command.append(&mut value.args);
27
28        // Set to None if the task is not parallel
29        let parallel = value.is_parallel.then_some(true);
30
31        Self { command, parallel }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::Tasks;
38
39    #[test]
40    fn test_parse_toml() {
41        // GIVEN
42        let toml = "
43        [[tasks]]
44        command = [\"cargo\", \"fmt\"]
45        parallel = false
46
47        [[tasks]]
48        command = [\"cargo\", \"clippy\", \"--\", \"-Dwarnings\"]
49        parallel = true
50
51        [[tasks]]
52        command = [\"cargo\", \"test\"]
53        ";
54
55        // WHEN
56        let tasks: Result<Tasks, toml::de::Error> = toml::from_str(&toml);
57
58        // THEN
59        assert!(tasks.is_ok());
60        let tasks = tasks.unwrap();
61
62        assert_eq!(tasks.tasks.len(), 3);
63
64        assert_eq!(tasks.tasks[0].command.len(), 2);
65        assert!(tasks.tasks[0].parallel.is_some_and(|x| !x));
66
67        assert_eq!(tasks.tasks[1].command.len(), 4);
68        assert!(tasks.tasks[1].parallel.is_some_and(|x| x));
69
70        assert_eq!(tasks.tasks[2].command.len(), 2);
71        assert!(tasks.tasks[2].parallel.is_none());
72    }
73}