dicom_toolkit_data/io/
transfer.rs1use dicom_toolkit_dict::ts::{transfer_syntaxes, ByteOrder, PixelEncoding, VrEncoding};
4use dicom_toolkit_dict::{transfer_syntaxes::IMPLICIT_VR_LITTLE_ENDIAN, Tag, Vr};
5
6pub 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 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
43pub 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}