releez/types/
release_config.rs1use 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}