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}