Skip to main content

opal/model/
artifacts.rs

1use std::path::PathBuf;
2use std::time::Duration;
3
4#[derive(Debug, Clone, Default)]
5pub struct ArtifactSpec {
6    pub name: Option<String>,
7    pub paths: Vec<PathBuf>,
8    pub exclude: Vec<String>,
9    pub untracked: bool,
10    pub when: ArtifactWhenSpec,
11    pub expire_in: Option<Duration>,
12    pub report_dotenv: Option<PathBuf>,
13}
14
15#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
16pub enum ArtifactWhenSpec {
17    #[default]
18    OnSuccess,
19    OnFailure,
20    Always,
21}
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24pub enum ArtifactSourceOutcome {
25    Success,
26    Failed,
27    Skipped,
28}
29
30impl ArtifactWhenSpec {
31    pub fn includes(self, outcome: Option<ArtifactSourceOutcome>) -> bool {
32        match self {
33            ArtifactWhenSpec::Always => true,
34            ArtifactWhenSpec::OnSuccess => matches!(outcome, Some(ArtifactSourceOutcome::Success)),
35            ArtifactWhenSpec::OnFailure => matches!(outcome, Some(ArtifactSourceOutcome::Failed)),
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::{ArtifactSourceOutcome, ArtifactWhenSpec};
43
44    #[test]
45    fn artifact_when_matches_expected_outcomes() {
46        assert!(ArtifactWhenSpec::Always.includes(None));
47        assert!(ArtifactWhenSpec::Always.includes(Some(ArtifactSourceOutcome::Success)));
48        assert!(ArtifactWhenSpec::OnSuccess.includes(Some(ArtifactSourceOutcome::Success)));
49        assert!(!ArtifactWhenSpec::OnSuccess.includes(Some(ArtifactSourceOutcome::Failed)));
50        assert!(ArtifactWhenSpec::OnFailure.includes(Some(ArtifactSourceOutcome::Failed)));
51        assert!(!ArtifactWhenSpec::OnFailure.includes(Some(ArtifactSourceOutcome::Skipped)));
52        assert!(!ArtifactWhenSpec::OnFailure.includes(None));
53    }
54}