use compact_str::CompactString;
use serde::{Deserialize, Serialize};
use crate::{JobId, PatientId, SeriesId, StudyId};
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct JobInfo {
pub completion_time: String,
#[serde(flatten)]
pub content: JobContent,
pub creation_time: String,
pub effective_runtime: f64,
pub error_code: i32,
pub error_description: String,
pub error_details: String,
#[serde(rename = "ID")]
pub id: JobId,
pub priority: i32,
pub progress: u8,
pub state: JobState,
pub timestamp: String,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone, Hash)]
pub enum JobState {
Pending,
Running,
Success,
Failure,
Paused,
Retry,
}
#[serde_with::serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "Type", content = "Content")]
pub enum JobContent {
#[serde(rename_all = "PascalCase")]
DicomMoveScu {
description: CompactString,
local_aet: CompactString,
query: Vec<MoveScuJobQuery>,
remote_aet: CompactString,
target_aet: CompactString,
},
DicomModalityStore {},
#[serde(rename_all = "PascalCase")]
OrthancPeerStore {
compress: bool,
description: CompactString,
failed_instances_count: usize,
instances_count: usize,
parent_resources: Vec<String>,
peer: [CompactString; 3],
#[serde_as(as = "serde_with::DisplayFromStr")]
size: u64,
},
ResourceModification(ResourceModificationContent),
MergeStudy {},
SplitStudy {},
StorageCommitmentScp {},
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct ResourceModification<I> {
pub description: CompactString,
pub failed_instances_count: usize,
#[serde(rename = "ID")]
pub id: I,
pub instances_count: usize,
pub is_anonymization: bool,
pub parent_resources: Vec<I>,
pub path: String,
#[serde(rename = "PatientID")]
pub patient_id: PatientId,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "Type")]
pub enum ResourceModificationContent {
Patient(ResourceModification<PatientId>),
Study(ResourceModification<StudyId>),
Series(ResourceModification<SeriesId>),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "0008,0052")]
pub enum MoveScuJobQuery {
#[serde(rename = "SERIES")]
Series {
#[serde(rename = "0010,0020")]
patient_id: CompactString,
#[serde(rename = "0008,0050")]
accession_number: CompactString,
#[serde(rename = "0020,000d")]
study_instance_uid: String,
#[serde(rename = "0020,000e")]
series_instance_uid: String,
},
#[serde(rename = "STUDY")]
Study {
#[serde(rename = "0010,0020")]
patient_id: CompactString,
#[serde(rename = "0008,0050")]
accession_number: CompactString,
#[serde(rename = "0020,000d")]
study_instance_uid: String,
},
#[serde(rename = "PATIENT")]
Patient {
#[serde(rename = "0010,0020")]
patient_id: CompactString,
},
}
impl MoveScuJobQuery {
pub fn study_instance_uid(&self) -> Option<&str> {
match self {
MoveScuJobQuery::Series {
study_instance_uid, ..
} => Some(study_instance_uid),
MoveScuJobQuery::Study {
study_instance_uid, ..
} => Some(study_instance_uid),
MoveScuJobQuery::Patient { .. } => None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct MoveScuJobQueryAny {
pub patient_id: CompactString,
pub accession_number: Option<CompactString>,
pub study_instance_uid: Option<String>,
pub series_instance_uid: Option<String>,
}
impl From<MoveScuJobQuery> for MoveScuJobQueryAny {
fn from(value: MoveScuJobQuery) -> Self {
match value {
MoveScuJobQuery::Series {
patient_id,
accession_number,
study_instance_uid,
series_instance_uid,
} => Self {
patient_id,
accession_number: Some(accession_number),
study_instance_uid: Some(study_instance_uid),
series_instance_uid: Some(series_instance_uid),
},
MoveScuJobQuery::Study {
patient_id,
accession_number,
study_instance_uid,
} => Self {
patient_id,
accession_number: Some(accession_number),
study_instance_uid: Some(study_instance_uid),
series_instance_uid: None,
},
MoveScuJobQuery::Patient { patient_id } => Self {
patient_id,
accession_number: None,
study_instance_uid: None,
series_instance_uid: None,
},
}
}
}
#[derive(Serialize, Deserialize, Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum QueryRetrieveLevel {
Study,
Series,
Image,
}