diff --git a/src/common.rs b/src/common.rs index cfdeeeb..8473d3e 100644 --- a/src/common.rs +++ b/src/common.rs @@ -105,15 +105,27 @@ pub enum SoV { Many(Vec), } -impl From> for SoV { - fn from(value: Vec) -> Self { - Self::Many(value) +impl SoV { + pub fn one(v: T) -> Self { + SoV::One(v) + } + + pub fn many(vs: Vec) -> Self { + SoV::Many(vs) } } -impl From for SoV { - fn from(value: T) -> Self { - Self::One(value) +impl<'a, T> IntoIterator for &'a SoV { + type Item = &'a T; + type IntoIter = std::slice::Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + let slice = match self { + SoV::One(v) => std::slice::from_ref(v), + SoV::Many(vs) => vs.as_slice(), + }; + + slice.iter() } } @@ -121,7 +133,7 @@ impl From for SoV { mod tests { use crate::common::{BasePermission, ExplicitPermissions}; - use super::Permissions; + use super::{Permissions, SoV}; #[test] fn test_permissions() { @@ -136,4 +148,17 @@ mod tests { Ok(_) )); } + + #[test] + fn test_sov_intoiterator() { + let sov_one = SoV::one("test".to_string()); + assert_eq!(sov_one.into_iter().collect::>(), vec!["test"]); + + let sov_many = SoV::many(vec!["test-1".to_string(), "test-2".to_string()]); + assert!(matches!(sov_many, SoV::Many(_))); + assert_eq!( + sov_many.into_iter().collect::>(), + vec!["test-1", "test-2"] + ); + } } diff --git a/src/workflow/job.rs b/src/workflow/job.rs index 6b1b809..a449ed8 100644 --- a/src/workflow/job.rs +++ b/src/workflow/job.rs @@ -7,6 +7,8 @@ use crate::common::{BoE, Env, LoE, Permissions, SoV}; use super::{Concurrency, Defaults}; +/// A "normal" GitHub Actions workflow job, i.e. a job composed of one +/// or more steps on a runner. #[derive(Deserialize)] #[serde(rename_all = "kebab-case")] pub struct NormalJob { diff --git a/tests/test_workflow.rs b/tests/test_workflow.rs index 3d6fb96..57f44ae 100644 --- a/tests/test_workflow.rs +++ b/tests/test_workflow.rs @@ -1,9 +1,12 @@ use std::{env, path::Path}; -use glomar_models::workflow::{ - event::OptionalBody, - job::{RunsOn, StepBody}, - Job, Trigger, Workflow, +use glomar_models::{ + common::SoV, + workflow::{ + event::OptionalBody, + job::{RunsOn, StepBody}, + Job, Trigger, Workflow, + }, }; fn load_workflow(name: &str) -> Workflow { @@ -41,7 +44,7 @@ fn test_pip_audit_ci() { assert_eq!(test_job.name, None); assert_eq!( test_job.runs_on, - RunsOn::Target(String::from("ubuntu-latest").into()) + RunsOn::Target(SoV::one("ubuntu-latest".to_string())) ); assert_eq!(test_job.steps.len(), 3);