Skip to main content

pdf_lib_rs/core/objects/
pdf_number.rs

1use std::fmt;
2use crate::utils::{copy_string_into_buffer, number_to_string};
3use super::pdf_object::PdfObjectTrait;
4
5/// A PDF numeric object (integer or real).
6#[derive(Clone, PartialEq)]
7pub struct PdfNumber {
8    number_value: f64,
9    string_value: String,
10}
11
12impl PdfNumber {
13    pub fn of(value: f64) -> Self {
14        let string_value = number_to_string(value);
15        PdfNumber {
16            number_value: value,
17            string_value,
18        }
19    }
20
21    pub fn as_number(&self) -> f64 {
22        self.number_value
23    }
24}
25
26impl fmt::Display for PdfNumber {
27    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28        write!(f, "{}", self.string_value)
29    }
30}
31
32impl fmt::Debug for PdfNumber {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        write!(f, "PdfNumber({})", self.string_value)
35    }
36}
37
38impl PdfObjectTrait for PdfNumber {
39    fn size_in_bytes(&self) -> usize {
40        self.string_value.len()
41    }
42
43    fn copy_bytes_into(&self, buffer: &mut [u8], offset: usize) -> usize {
44        copy_string_into_buffer(&self.string_value, buffer, offset)
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_constructed() {
55        let _ = PdfNumber::of(21.0);
56        let _ = PdfNumber::of(-43.0);
57        let _ = PdfNumber::of(-0.1e7);
58    }
59
60    #[test]
61    fn can_be_cloned() {
62        let original = PdfNumber::of(-21.42);
63        let clone = original.clone();
64        assert_eq!(clone.to_string(), original.to_string());
65    }
66
67    #[test]
68    fn can_be_converted_to_string() {
69        assert_eq!(PdfNumber::of(21.0).to_string(), "21");
70        assert_eq!(PdfNumber::of(-43.0).to_string(), "-43");
71    }
72
73    #[test]
74    fn can_provide_size_in_bytes() {
75        assert_eq!(PdfNumber::of(21.0).size_in_bytes(), 2);
76        assert_eq!(PdfNumber::of(-43.0).size_in_bytes(), 3);
77    }
78
79    #[test]
80    fn can_be_serialized() {
81        let mut buffer1 = vec![b' '; 8];
82        assert_eq!(PdfNumber::of(21.0).copy_bytes_into(&mut buffer1, 3), 2);
83        assert_eq!(buffer1, typed_array_for("   21   "));
84    }
85}