Skip to main content

releez/types/
release_config.rs

1use crate::prelude::*;
2use crate::utils::system_val_resolver::resolve_system_dependent_value_config;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
7#[serde(rename_all = "camelCase")]
8pub struct ReleaseConfig {
9    pub version: String,
10    pub checklist: Vec<Task>,
11}
12
13#[derive(Serialize, Deserialize, Debug, Clone)]
14#[serde(rename_all = "camelCase")]
15pub struct Task {
16    pub name: String,
17    #[serde(rename = "type")]
18    pub task_type: TaskType,
19    pub instructions: Option<Value>,
20    pub run: Option<Value>,
21    pub confirm: Option<String>,
22    #[serde(skip)]
23    sub_tasks: Vec<String>,
24}
25
26#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
27pub enum TaskType {
28    #[serde(rename = "manual")]
29    Manual,
30    #[serde(rename = "auto")]
31    Auto,
32}
33
34impl ReleaseConfig {
35    pub fn parse(config_text: &str) -> crate::Result<ReleaseConfig> {
36        let mut config = serde_yaml::from_str::<ReleaseConfig>(config_text).wrap()?;
37
38        for task in config.checklist.iter_mut() {
39            let val = match task.task_type {
40                TaskType::Auto => task.run.as_ref(),
41                TaskType::Manual => task.instructions.as_ref(),
42            };
43
44            if let Some(val) = val {
45                task.sub_tasks = resolve_system_dependent_value_config(val);
46            } else {
47                task.sub_tasks = Vec::new();
48            }
49        }
50
51        Ok(config)
52    }
53}
54
55impl Task {
56    pub fn sub_tasks(&self) -> &Vec<String> {
57        &self.sub_tasks
58    }
59}