use crate::uid::name_based_uid;
use crate::{MwlError, WorklistItem};
use dicom_core::header::HasLength;
use dicom_dictionary_std::{tags, uids};
use dicom_object::meta::FileMetaTableBuilder;
use dicom_object::{FileDicomObject, InMemDicomObject};
const FILE_NAMESPACE: &str = "mwlkit.file-instance-uid";
pub fn to_bytes(item: &WorklistItem) -> Result<Vec<u8>, MwlError> {
let file = to_file(item)?;
let mut out = Vec::new();
file.write_all(&mut out)
.map_err(|e| MwlError::Write(e.to_string()))?;
Ok(out)
}
pub fn to_file(item: &WorklistItem) -> Result<FileDicomObject<InMemDicomObject>, MwlError> {
let meta = FileMetaTableBuilder::new()
.media_storage_sop_class_uid(uids::MODALITY_WORKLIST_INFORMATION_MODEL_FIND)
.media_storage_sop_instance_uid(instance_uid(item))
.transfer_syntax(uids::EXPLICIT_VR_LITTLE_ENDIAN);
item.dataset
.clone()
.with_meta(meta)
.map_err(|e| MwlError::Write(e.to_string()))
}
fn instance_uid(item: &WorklistItem) -> String {
let mut name = item.study_uid.value.clone();
if let Some(seq) = item
.dataset
.get(tags::SCHEDULED_PROCEDURE_STEP_SEQUENCE)
.and_then(|e| e.items())
{
for sps in seq {
if let Some(id) = sps.get(tags::SCHEDULED_PROCEDURE_STEP_ID) {
if !id.is_empty() {
name.push('|');
name.push_str(id.value().to_str().unwrap_or_default().trim());
}
}
}
}
name_based_uid(FILE_NAMESPACE, &name)
}