dicom_core/value/
serialize.rs

1//! Encoding of primitive values.
2use crate::value::{DicomDate, DicomDateTime, DicomTime};
3use std::io::{Result as IoResult, Write};
4
5/** Encode a single date in accordance to the DICOM Date (DA)
6 * value representation.
7 */
8pub fn encode_date<W>(mut to: W, date: DicomDate) -> IoResult<usize>
9where
10    W: Write,
11{
12    // YYYY(MM(DD)?)?
13    let len = date.to_encoded().len();
14    write!(to, "{}", date.to_encoded())?;
15    Ok(len)
16}
17
18/** Encode a single time value in accordance to the DICOM Time (TM)
19 * value representation.
20 */
21pub fn encode_time<W>(mut to: W, time: DicomTime) -> IoResult<usize>
22where
23    W: Write,
24{
25    // HH(MM(SS(.F{1,6})?)?)?
26    let len = time.to_encoded().len();
27    write!(to, "{}", time.to_encoded())?;
28    Ok(len)
29}
30
31/** Encode a single date-time value in accordance to the DICOM DateTime (DT)
32 * value representation.
33 */
34pub fn encode_datetime<W>(mut to: W, dt: DicomDateTime) -> IoResult<usize>
35where
36    W: Write,
37{
38    let value = dt.to_encoded();
39    let len = value.len();
40    write!(to, "{}", value)?;
41    Ok(len)
42}
43
44#[cfg(test)]
45mod test {
46    use super::*;
47    use chrono::FixedOffset;
48    use std::str::from_utf8;
49
50    #[test]
51    fn test_encode_date() {
52        let mut data = vec![];
53        encode_date(&mut data, DicomDate::from_ym(1985, 12).unwrap()).unwrap();
54        assert_eq!(&data, &*b"198512");
55    }
56
57    #[test]
58    fn test_encode_time() {
59        let mut data = vec![];
60        encode_time(
61            &mut data,
62            DicomTime::from_hms_micro(23, 59, 48, 123456).unwrap(),
63        )
64        .unwrap();
65        assert_eq!(&data, &*b"235948.123456");
66
67        let mut data = vec![];
68        encode_time(&mut data, DicomTime::from_hms(12, 0, 30).unwrap()).unwrap();
69        assert_eq!(&data, &*b"120030");
70
71        let mut data = vec![];
72        encode_time(&mut data, DicomTime::from_h(9).unwrap()).unwrap();
73        assert_eq!(&data, &*b"09");
74    }
75
76    #[test]
77    fn test_encode_datetime() {
78        let mut data = vec![];
79        let bytes = encode_datetime(
80            &mut data,
81            DicomDateTime::from_date_and_time(
82                DicomDate::from_ymd(1985, 12, 31).unwrap(),
83                DicomTime::from_hms_micro(23, 59, 48, 123_456).unwrap(),
84            )
85            .unwrap(),
86        )
87        .unwrap();
88        assert_eq!(from_utf8(&data).unwrap(), "19851231235948.123456");
89        assert_eq!(bytes, 21);
90
91        let mut data = vec![];
92        let offset = FixedOffset::east_opt(3600).unwrap();
93        let bytes = encode_datetime(
94            &mut data,
95            DicomDateTime::from_date_and_time_with_time_zone(
96                DicomDate::from_ymd(2018, 12, 24).unwrap(),
97                DicomTime::from_h(4).unwrap(),
98                offset,
99            )
100            .unwrap(),
101        )
102        .unwrap();
103        assert_eq!(from_utf8(&data).unwrap(), "2018122404+0100");
104        assert_eq!(bytes, 15);
105    }
106}