orcs 0.0.8

Microservices monorepo orchestration tool
Documentation
use crate::Actions;
use serde::{Deserialize, Serialize};

/// Stages in an Orcs Service File
#[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),
        }
    }
}