dicom-object 0.9.1

A high-level API for reading and manipulating DICOM objects
Documentation
use std::{
    fs::File,
    io::{BufReader, Read},
};

use dicom_core::value::Value;
use dicom_dictionary_std::tags;
use dicom_encoding::text::SpecificCharacterSet;
use dicom_object::{
    file::{OpenFileOptions, ReadPreamble},
    mem::InMemDicomObject,
    open_file,
};
#[test]
fn test_ob_value_with_unknown_length() {
    let path =
        dicom_test_files::path("pydicom/JPEG2000.dcm").expect("test DICOM file should exist");
    let object = open_file(&path).unwrap();
    let element = object.element_by_name("PixelData").unwrap();

    match element.value() {
        Value::PixelSequence(seq) => {
            let fragments = seq.fragments();
            // check offset table
            assert_eq!(seq.offset_table().len(), 0);

            // check if the leading and trailing bytes look right
            assert_eq!(fragments.len(), 1);
            let fragment = &fragments[0];
            assert_eq!(fragment[0..2], [255, 79]);
            assert_eq!(fragment[fragment.len() - 2..fragment.len()], [255, 217]);
        }
        value => {
            panic!("expected a pixel sequence, but got {:?}", value);
        }
    }
}

#[test]
fn test_read_until_pixel_data() {
    let path =
        dicom_test_files::path("pydicom/JPEG2000.dcm").expect("test DICOM file should exist");
    let object = OpenFileOptions::new()
        .read_until(tags::PIXEL_DATA)
        .open_file(&path)
        .expect("File should open successfully");

    // contains other elements such as modality
    let element = object.element(tags::MODALITY).unwrap();
    assert_eq!(element.value().to_str().unwrap(), "NM");

    // but does not contain pixel data
    assert!(matches!(
        object.element(tags::PIXEL_DATA),
        Err(dicom_object::AccessError::NoSuchDataElementTag { .. })
    ));
}

#[test]
fn test_read_data_with_preamble() {
    let path = dicom_test_files::path("pydicom/liver.dcm").expect("test DICOM file should exist");
    let source = BufReader::new(File::open(path).unwrap());

    // should read preamble even though it's from a reader
    let object = OpenFileOptions::new()
        .read_preamble(ReadPreamble::Always)
        .from_reader(source)
        .expect("Should read from source successfully");

    // contains elements such as study date
    let element = object.element(tags::STUDY_DATE).unwrap();
    assert_eq!(element.value().to_str().unwrap(), "20030417");
}

#[test]
fn test_read_data_with_preamble_auto() {
    let path = dicom_test_files::path("pydicom/liver.dcm").expect("test DICOM file should exist");
    let source = BufReader::new(File::open(path).unwrap());

    // should read preamble even though it's from a reader
    let object = OpenFileOptions::new()
        .from_reader(source)
        .expect("Should read from source successfully");

    // contains elements such as study date
    let element = object.element(tags::STUDY_DATE).unwrap();
    assert_eq!(element.value().to_str().unwrap(), "20030417");
}

#[test]
fn test_read_data_without_preamble() {
    let path = dicom_test_files::path("pydicom/liver.dcm").expect("test DICOM file should exist");
    let mut source = BufReader::new(File::open(path).unwrap());

    // read preamble manually
    let mut preamble = [0; 128];

    source.read_exact(&mut preamble).unwrap();

    // explicitly do not read preamble
    let object = OpenFileOptions::new()
        .read_preamble(ReadPreamble::Never)
        .from_reader(source)
        .expect("Should read from source successfully");

    // contains elements such as study date
    let element = object.element(tags::STUDY_DATE).unwrap();
    assert_eq!(element.value().to_str().unwrap(), "20030417");
}

#[test]
fn test_read_data_without_preamble_auto() {
    let path = dicom_test_files::path("pydicom/liver.dcm").expect("test DICOM file should exist");
    let mut source = BufReader::new(File::open(path).unwrap());

    // skip preamble
    let mut preamble = [0; 128];

    source.read_exact(&mut preamble).unwrap();

    // detect lack of preamble automatically
    let object = OpenFileOptions::new()
        .from_reader(source)
        .expect("Should read from source successfully");

    // contains elements such as study date
    let element = object.element(tags::STUDY_DATE).unwrap();
    assert_eq!(element.value().to_str().unwrap(), "20030417");
}

#[test]
fn test_expl_vr_le_no_meta() {
    let path = dicom_test_files::path("pydicom/ExplVR_LitEndNoMeta.dcm")
        .expect("test DICOM file should exist");
    let source = BufReader::new(File::open(path).unwrap());
    let ts = dicom_transfer_syntax_registry::entries::EXPLICIT_VR_LITTLE_ENDIAN.erased();
    let object =
        InMemDicomObject::read_dataset_with_ts_cs(source, &ts, SpecificCharacterSet::default())
            .unwrap();

    let sop_instance_uid = object.element_by_name("SOPInstanceUID").unwrap();
    assert_eq!(sop_instance_uid.to_str().unwrap(), "1.2.333.4444.5.6.7.8",);

    let series_instance_uid = object.element_by_name("SeriesInstanceUID").unwrap();
    assert_eq!(
        series_instance_uid.to_str().unwrap(),
        "1.2.333.4444.5.6.7.8.99",
    );

    let frame_of_reference_uid = object.element_by_name("FrameOfReferenceUID").unwrap();
    assert_eq!(
        frame_of_reference_uid.to_str().unwrap(),
        "1.2.333.4444.5.6.7.8.9",
    );
}