Skip to main content

dicom_toolkit_data/io/
transfer.rs

1//! Transfer syntax properties helpers.
2
3use dicom_toolkit_dict::ts::{transfer_syntaxes, ByteOrder, PixelEncoding, VrEncoding};
4use dicom_toolkit_dict::{transfer_syntaxes::IMPLICIT_VR_LITTLE_ENDIAN, Tag, Vr};
5
6/// Properties of a transfer syntax relevant to encoding/decoding.
7pub struct TransferSyntaxProperties {
8    pub byte_order: ByteOrder,
9    pub vr_encoding: VrEncoding,
10    pub is_deflated: bool,
11    pub is_encapsulated: bool,
12}
13
14impl TransferSyntaxProperties {
15    pub fn from_uid(uid: &str) -> Self {
16        if let Some(ts) = transfer_syntaxes::by_uid(uid) {
17            Self {
18                byte_order: ts.byte_order,
19                vr_encoding: ts.vr_encoding,
20                is_deflated: ts.deflated,
21                is_encapsulated: ts.pixel_encoding == PixelEncoding::Encapsulated,
22            }
23        } else {
24            // Unknown TS → Explicit VR LE (safest default)
25            Self {
26                byte_order: ByteOrder::LittleEndian,
27                vr_encoding: VrEncoding::Explicit,
28                is_deflated: false,
29                is_encapsulated: false,
30            }
31        }
32    }
33
34    pub fn is_little_endian(&self) -> bool {
35        self.byte_order == ByteOrder::LittleEndian
36    }
37
38    pub fn is_explicit_vr(&self) -> bool {
39        self.vr_encoding == VrEncoding::Explicit
40    }
41}
42
43/// Infer the VR for a tag in Implicit VR transfer syntaxes.
44/// Returns `Vr::UN` for unknown tags.
45pub fn implicit_vr_for_tag(tag: Tag) -> Vr {
46    IMPLICIT_VR_LITTLE_ENDIAN.resolve_vr(tag).unwrap_or(Vr::UN)
47}
48
49#[cfg(test)]
50mod tests {
51    use super::implicit_vr_for_tag;
52    use dicom_toolkit_dict::{tags, Tag, Vr};
53
54    #[test]
55    fn implicit_vr_lookup_resolves_dimse_query_tags() {
56        assert_eq!(implicit_vr_for_tag(tags::QUERY_RETRIEVE_LEVEL), Vr::CS);
57        assert_eq!(implicit_vr_for_tag(tags::MODALITIES_IN_STUDY), Vr::CS);
58        assert_eq!(implicit_vr_for_tag(tags::ISSUER_OF_PATIENT_ID), Vr::LO);
59        assert_eq!(
60            implicit_vr_for_tag(tags::NUMBER_OF_STUDY_RELATED_SERIES),
61            Vr::IS
62        );
63        assert_eq!(
64            implicit_vr_for_tag(tags::NUMBER_OF_STUDY_RELATED_INSTANCES),
65            Vr::IS
66        );
67    }
68
69    #[test]
70    fn implicit_vr_lookup_falls_back_to_un_for_unknown_tags() {
71        assert_eq!(implicit_vr_for_tag(Tag::new(0x9999, 0x9999)), Vr::UN);
72    }
73}