pdf_lib_rs/core/objects/
pdf_number.rs1use std::fmt;
2use crate::utils::{copy_string_into_buffer, number_to_string};
3use super::pdf_object::PdfObjectTrait;
4
5#[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}