Skip to main content

laser_pdf/
image.rs

1use serde::{Deserializer, de::Visitor};
2
3pub fn deserialize_buffer<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, D::Error> {
4    struct FileVisitor;
5
6    impl<'de> Visitor<'de> for FileVisitor {
7        type Value = Vec<u8>;
8
9        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
10            formatter.write_str("a valid path")
11        }
12
13        fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
14            std::fs::read(v).map_err(|e| E::custom(e))
15        }
16
17        fn visit_borrowed_str<E: serde::de::Error>(self, v: &'de str) -> Result<Self::Value, E> {
18            std::fs::read(v).map_err(|e| E::custom(e))
19        }
20
21        fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
22            std::fs::read(v).map_err(|e| E::custom(e))
23        }
24    }
25
26    Ok(deserializer.deserialize_str(FileVisitor)?)
27}
28
29pub fn deserialize_svg<'de, D: Deserializer<'de>>(deserializer: D) -> Result<usvg::Tree, D::Error> {
30    struct SvgVisitor;
31
32    impl<'de> Visitor<'de> for SvgVisitor {
33        type Value = usvg::Tree;
34
35        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
36            formatter.write_str("a valid svg")
37        }
38
39        fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
40            usvg::Tree::from_str(v, &Default::default()).map_err(|e| E::custom(e))
41        }
42
43        fn visit_borrowed_str<E: serde::de::Error>(self, v: &'de str) -> Result<Self::Value, E> {
44            usvg::Tree::from_str(v, &Default::default()).map_err(|e| E::custom(e))
45        }
46
47        fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
48            usvg::Tree::from_str(&v, &Default::default()).map_err(|e| E::custom(e))
49        }
50    }
51
52    Ok(deserializer.deserialize_str(SvgVisitor)?)
53}
54
55pub fn deserialize_svg_from_path<'de, D: Deserializer<'de>>(
56    deserializer: D,
57) -> Result<usvg::Tree, D::Error> {
58    struct SvgVisitor;
59
60    impl<'de> Visitor<'de> for SvgVisitor {
61        type Value = usvg::Tree;
62
63        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
64            formatter.write_str("a valid svg")
65        }
66
67        fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
68            let data = std::fs::read(v).map_err(|e| E::custom(e))?;
69            usvg::Tree::from_data(&data, &Default::default()).map_err(|e| E::custom(e))
70        }
71
72        fn visit_borrowed_str<E: serde::de::Error>(self, v: &'de str) -> Result<Self::Value, E> {
73            let data = std::fs::read(v).map_err(|e| E::custom(e))?;
74            usvg::Tree::from_data(&data, &Default::default()).map_err(|e| E::custom(e))
75        }
76
77        fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
78            let data = std::fs::read(v).map_err(|e| E::custom(e))?;
79            usvg::Tree::from_data(&data, &Default::default()).map_err(|e| E::custom(e))
80        }
81    }
82
83    Ok(deserializer.deserialize_str(SvgVisitor)?)
84}
85
86#[derive(Clone)]
87pub enum Image {
88    Svg(usvg::Tree),
89    Pixel(image::DynamicImage),
90}
91
92pub fn deserialize_image<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Image, D::Error> {
93    struct ImageVisitor;
94
95    fn visit<E: serde::de::Error>(path: impl AsRef<std::path::Path>) -> Result<Image, E> {
96        if path.as_ref().extension().map_or(false, |e| e == "svg") {
97            Ok(Image::Svg({
98                let data = std::fs::read(path).map_err(|e| E::custom(e))?;
99                usvg::Tree::from_data(&data, &Default::default()).map_err(|e| E::custom(e))?
100            }))
101        } else {
102            Ok(Image::Pixel(image::open(path).map_err(E::custom)?))
103        }
104    }
105
106    impl<'de> Visitor<'de> for ImageVisitor {
107        type Value = Image;
108
109        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
110            formatter.write_str("a valid image")
111        }
112
113        fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
114            visit(v)
115        }
116
117        fn visit_borrowed_str<E: serde::de::Error>(self, v: &'de str) -> Result<Self::Value, E> {
118            visit(v)
119        }
120
121        fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
122            visit(v)
123        }
124    }
125
126    Ok(deserializer.deserialize_str(ImageVisitor)?)
127}