use crate::Actions;
use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct Stage {
#[serde(default)]
pub depends_on: Vec<String>,
#[serde(default = "default_actions")]
pub actions: Actions,
#[serde(default = "default_check")]
pub check: Actions,
}
impl Stage {
pub fn use_recipe(&mut self, recipe: Self) {
if self.actions.is_empty() {
self.actions = recipe.actions;
}
if self.check.is_empty() {
self.check = recipe.check;
}
}
}
#[inline]
fn default_actions() -> Actions {
Actions::Override(true)
}
#[inline]
fn default_check() -> Actions {
Actions::Override(false)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stage_use_recipe_overwrite() {
let data = "echo hello".to_string();
let actions = Actions::Multiline(data.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: Default::default(),
};
let stage2 = Stage {
depends_on: Default::default(),
actions,
check: Default::default(),
};
stage1.use_recipe(stage2);
match stage1.actions {
Actions::Multiline(val) => assert_eq!(val, data),
_ => assert!(false),
}
}
#[test]
fn stage_use_recipe_no_overwite() {
let data1 = vec!["echo hello".to_string()];
let actions1 = Actions::Array(data1.clone());
let data2 = "echo hello".to_string();
let actions2 = Actions::Multiline(data2.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: actions1,
check: Default::default(),
};
let stage2 = Stage {
depends_on: Default::default(),
actions: actions2,
check: Default::default(),
};
stage1.use_recipe(stage2);
match stage1.actions {
Actions::Array(val) => assert_eq!(val, data1),
_ => assert!(false),
}
}
#[test]
fn stage_use_recipe_false() {
let data = "echo hello".to_string();
let actions = Actions::Multiline(data.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: Actions::Override(false),
check: Default::default(),
};
let stage2 = Stage {
depends_on: Default::default(),
actions,
check: Default::default(),
};
stage1.use_recipe(stage2);
match stage1.actions {
Actions::Override(val) => assert_eq!(val, false),
_ => assert!(false),
}
}
#[test]
fn stage_use_recipe_overwrite_check() {
let data = "echo hello".to_string();
let actions = Actions::Multiline(data.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: Default::default(),
};
let stage2 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: actions,
};
stage1.use_recipe(stage2);
match stage1.check {
Actions::Multiline(val) => assert_eq!(val, data),
_ => assert!(false),
}
}
#[test]
fn stage_use_recipe_no_overwite_check() {
let data1 = vec!["echo hello".to_string()];
let actions1 = Actions::Array(data1.clone());
let data2 = "echo hello".to_string();
let actions2 = Actions::Multiline(data2.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: actions1,
};
let stage2 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: actions2,
};
stage1.use_recipe(stage2);
match stage1.check {
Actions::Array(val) => assert_eq!(val, data1),
_ => assert!(false),
}
}
#[test]
fn stage_use_recipe_false_check() {
let data = "echo hello".to_string();
let actions = Actions::Multiline(data.clone());
let mut stage1 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: Actions::Override(false),
};
let stage2 = Stage {
depends_on: Default::default(),
actions: Default::default(),
check: actions,
};
stage1.use_recipe(stage2);
match stage1.check {
Actions::Override(val) => assert_eq!(val, false),
_ => assert!(false),
}
}
}