diff --git a/src/launch.rs b/src/launch.rs index 5531459..6fef6b6 100644 --- a/src/launch.rs +++ b/src/launch.rs @@ -226,9 +226,9 @@ pub fn parse_perspecta_uri(uri: &str) -> Result { .collect::>(); for (index, group) in groups.iter().enumerate() { - if group.len() != 1 && group.len() != 4 { + if !matches!(group.len(), 1 | 2 | 4) { return Err(format!( - "Group {} has {} paths. Each group must contain exactly 1 or 4 DICOM paths.", + "Group {} has {} paths. Each group must contain exactly 1, 2, or 4 DICOM paths.", index, group.len() )); @@ -264,9 +264,9 @@ pub fn parse_perspecta_uri(uri: &str) -> Result { }; for (index, group) in grouped_series_uids.iter().enumerate() { - if group.len() != 1 && group.len() != 4 { + if !matches!(group.len(), 1 | 2 | 4) { return Err(format!( - "group_series group {} has {} series UIDs. Each group must contain exactly 1 or 4 series UIDs.", + "group_series group {} has {} series UIDs. Each group must contain exactly 1, 2, or 4 series UIDs.", index, group.len() )); @@ -631,6 +631,25 @@ mod tests { ); } + #[test] + fn parse_dicomweb_grouped_series_request_supports_two_up() { + let request = parse_perspecta_uri( + "perspecta://open?dicomweb=http%3A%2F%2Flocalhost%3A8042%2Fdicom-web&study=study_uid_alpha&group_series=series_a|series_b", + ) + .expect("URI should parse"); + assert_eq!( + request, + LaunchRequest::DicomWebGroups(DicomWebGroupedLaunchRequest { + base_url: "http://localhost:8042/dicom-web".to_string(), + study_uid: "study_uid_alpha".to_string(), + groups: vec![vec!["series_a".to_string(), "series_b".to_string()]], + open_group: 0, + username: None, + password: None, + }) + ); + } + #[test] fn parse_dicomweb_grouped_series_requires_dicomweb_url() { let error = parse_perspecta_uri( @@ -681,6 +700,23 @@ mod tests { ); } + #[test] + fn parse_grouped_local_request_supports_two_up() { + let request = + parse_perspecta_uri("perspecta://open?group=example-data%2Fa.dcm|example-data%2Fb.dcm") + .expect("URI should parse"); + assert_eq!( + request, + LaunchRequest::LocalGroups { + groups: vec![vec![ + PathBuf::from("example-data/a.dcm"), + PathBuf::from("example-data/b.dcm"), + ]], + open_group: 0, + } + ); + } + #[test] fn parse_cli_falls_back_to_raw_paths() { let args = vec![