Skip to main content

pdf_lib_rs/core/objects/
pdf_bool.rs

1use std::fmt;
2use super::pdf_object::PdfObjectTrait;
3
4/// A PDF boolean object (`true` or `false`).
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct PdfBool {
7    value: bool,
8}
9
10impl PdfBool {
11    pub const TRUE: PdfBool = PdfBool { value: true };
12    pub const FALSE: PdfBool = PdfBool { value: false };
13
14    pub fn as_boolean(&self) -> bool {
15        self.value
16    }
17}
18
19impl fmt::Display for PdfBool {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        write!(f, "{}", self.value)
22    }
23}
24
25impl PdfObjectTrait for PdfBool {
26    fn size_in_bytes(&self) -> usize {
27        if self.value { 4 } else { 5 }
28    }
29
30    fn copy_bytes_into(&self, buffer: &mut [u8], offset: usize) -> usize {
31        if self.value {
32            buffer[offset] = b't';
33            buffer[offset + 1] = b'r';
34            buffer[offset + 2] = b'u';
35            buffer[offset + 3] = b'e';
36            4
37        } else {
38            buffer[offset] = b'f';
39            buffer[offset + 1] = b'a';
40            buffer[offset + 2] = b'l';
41            buffer[offset + 3] = b's';
42            buffer[offset + 4] = b'e';
43            5
44        }
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51    use crate::utils::typed_array_for;
52
53    #[test]
54    fn can_be_converted_to_boolean() {
55        assert!(PdfBool::TRUE.as_boolean());
56        assert!(!PdfBool::FALSE.as_boolean());
57    }
58
59    #[test]
60    fn can_be_cloned() {
61        assert_eq!(PdfBool::TRUE.clone(), PdfBool::TRUE);
62        assert_eq!(PdfBool::FALSE.clone(), PdfBool::FALSE);
63    }
64
65    #[test]
66    fn can_be_converted_to_string() {
67        assert_eq!(PdfBool::TRUE.to_string(), "true");
68        assert_eq!(PdfBool::FALSE.to_string(), "false");
69    }
70
71    #[test]
72    fn can_provide_size_in_bytes() {
73        assert_eq!(PdfBool::TRUE.size_in_bytes(), 4);
74        assert_eq!(PdfBool::FALSE.size_in_bytes(), 5);
75    }
76
77    #[test]
78    fn can_be_serialized_when_true() {
79        let mut buffer = vec![b' '; 8];
80        assert_eq!(PdfBool::TRUE.copy_bytes_into(&mut buffer, 3), 4);
81        assert_eq!(buffer, typed_array_for("   true "));
82    }
83
84    #[test]
85    fn can_be_serialized_when_false() {
86        let mut buffer = vec![b' '; 9];
87        assert_eq!(PdfBool::FALSE.copy_bytes_into(&mut buffer, 1), 5);
88        assert_eq!(buffer, typed_array_for(" false   "));
89    }
90}