/rust/registry/src/index.crates.io-6f17d22bba15001f/quick-xml-0.29.0/src/utils.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use std::borrow::{Borrow, Cow}; |
2 | | use std::fmt::{self, Debug, Formatter}; |
3 | | use std::ops::Deref; |
4 | | |
5 | | #[cfg(feature = "serialize")] |
6 | | use serde::de::{Deserialize, Deserializer, Error, Visitor}; |
7 | | #[cfg(feature = "serialize")] |
8 | | use serde::ser::{Serialize, Serializer}; |
9 | | |
10 | | #[allow(clippy::ptr_arg)] |
11 | 0 | pub fn write_cow_string(f: &mut Formatter, cow_string: &Cow<[u8]>) -> fmt::Result { |
12 | 0 | match cow_string { |
13 | 0 | Cow::Owned(s) => { |
14 | 0 | write!(f, "Owned(")?; |
15 | 0 | write_byte_string(f, s)?; |
16 | | } |
17 | 0 | Cow::Borrowed(s) => { |
18 | 0 | write!(f, "Borrowed(")?; |
19 | 0 | write_byte_string(f, s)?; |
20 | | } |
21 | | } |
22 | 0 | write!(f, ")") |
23 | 0 | } |
24 | | |
25 | 0 | pub fn write_byte_string(f: &mut Formatter, byte_string: &[u8]) -> fmt::Result { |
26 | 0 | write!(f, "\"")?; |
27 | 0 | for b in byte_string { |
28 | 0 | match *b { |
29 | 0 | 32..=33 | 35..=126 => write!(f, "{}", *b as char)?, |
30 | 0 | 34 => write!(f, "\\\"")?, |
31 | 0 | _ => write!(f, "{:#02X}", b)?, |
32 | | } |
33 | | } |
34 | 0 | write!(f, "\"")?; |
35 | 0 | Ok(()) |
36 | 0 | } |
37 | | |
38 | | //////////////////////////////////////////////////////////////////////////////////////////////////// |
39 | | |
40 | | /// A version of [`Cow`] that can borrow from two different buffers, one of them |
41 | | /// is a deserializer input. |
42 | | /// |
43 | | /// # Lifetimes |
44 | | /// |
45 | | /// - `'i`: lifetime of the data that deserializer borrow from the parsed input |
46 | | /// - `'s`: lifetime of the data that owned by a deserializer |
47 | | pub enum CowRef<'i, 's, B> |
48 | | where |
49 | | B: ToOwned + ?Sized, |
50 | | { |
51 | | /// An input borrowed from the parsed data |
52 | | Input(&'i B), |
53 | | /// An input borrowed from the buffer owned by another deserializer |
54 | | Slice(&'s B), |
55 | | /// An input taken from an external deserializer, owned by that deserializer |
56 | | Owned(<B as ToOwned>::Owned), |
57 | | } |
58 | | impl<'i, 's, B> Deref for CowRef<'i, 's, B> |
59 | | where |
60 | | B: ToOwned + ?Sized, |
61 | | B::Owned: Borrow<B>, |
62 | | { |
63 | | type Target = B; |
64 | | |
65 | 0 | fn deref(&self) -> &B { |
66 | 0 | match *self { |
67 | 0 | Self::Input(borrowed) => borrowed, |
68 | 0 | Self::Slice(borrowed) => borrowed, |
69 | 0 | Self::Owned(ref owned) => owned.borrow(), |
70 | | } |
71 | 0 | } |
72 | | } |
73 | | |
74 | | impl<'i, 's, B> Debug for CowRef<'i, 's, B> |
75 | | where |
76 | | B: ToOwned + ?Sized + Debug, |
77 | | B::Owned: Debug, |
78 | | { |
79 | 0 | fn fmt(&self, f: &mut Formatter) -> fmt::Result { |
80 | 0 | match *self { |
81 | 0 | Self::Input(borrowed) => Debug::fmt(borrowed, f), |
82 | 0 | Self::Slice(borrowed) => Debug::fmt(borrowed, f), |
83 | 0 | Self::Owned(ref owned) => Debug::fmt(owned, f), |
84 | | } |
85 | 0 | } |
86 | | } |
87 | | |
88 | | //////////////////////////////////////////////////////////////////////////////////////////////////// |
89 | | |
90 | | /// Wrapper around `Vec<u8>` that has a human-readable debug representation: |
91 | | /// printable ASCII symbols output as is, all other output in HEX notation. |
92 | | /// |
93 | | /// Also, when `serialize` feature is on, this type deserialized using |
94 | | /// [`deserialize_byte_buf`](serde::Deserializer::deserialize_byte_buf) instead |
95 | | /// of vector's generic [`deserialize_seq`](serde::Deserializer::deserialize_seq) |
96 | | #[derive(PartialEq, Eq)] |
97 | | pub struct ByteBuf(pub Vec<u8>); |
98 | | |
99 | | impl Debug for ByteBuf { |
100 | 0 | fn fmt(&self, f: &mut Formatter) -> fmt::Result { |
101 | 0 | write_byte_string(f, &self.0) |
102 | 0 | } |
103 | | } |
104 | | |
105 | | #[cfg(feature = "serialize")] |
106 | | impl<'de> Deserialize<'de> for ByteBuf { |
107 | | fn deserialize<D>(d: D) -> Result<Self, D::Error> |
108 | | where |
109 | | D: Deserializer<'de>, |
110 | | { |
111 | | struct ValueVisitor; |
112 | | |
113 | | impl<'de> Visitor<'de> for ValueVisitor { |
114 | | type Value = ByteBuf; |
115 | | |
116 | | fn expecting(&self, f: &mut Formatter) -> fmt::Result { |
117 | | f.write_str("byte data") |
118 | | } |
119 | | |
120 | | fn visit_bytes<E: Error>(self, v: &[u8]) -> Result<Self::Value, E> { |
121 | | Ok(ByteBuf(v.to_vec())) |
122 | | } |
123 | | |
124 | | fn visit_byte_buf<E: Error>(self, v: Vec<u8>) -> Result<Self::Value, E> { |
125 | | Ok(ByteBuf(v)) |
126 | | } |
127 | | } |
128 | | |
129 | | d.deserialize_byte_buf(ValueVisitor) |
130 | | } |
131 | | } |
132 | | |
133 | | #[cfg(feature = "serialize")] |
134 | | impl Serialize for ByteBuf { |
135 | | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
136 | | where |
137 | | S: Serializer, |
138 | | { |
139 | | serializer.serialize_bytes(&self.0) |
140 | | } |
141 | | } |
142 | | |
143 | | //////////////////////////////////////////////////////////////////////////////////////////////////// |
144 | | |
145 | | /// Wrapper around `&[u8]` that has a human-readable debug representation: |
146 | | /// printable ASCII symbols output as is, all other output in HEX notation. |
147 | | /// |
148 | | /// Also, when `serialize` feature is on, this type deserialized using |
149 | | /// [`deserialize_bytes`](serde::Deserializer::deserialize_bytes) instead |
150 | | /// of vector's generic [`deserialize_seq`](serde::Deserializer::deserialize_seq) |
151 | | #[derive(PartialEq, Eq)] |
152 | | pub struct Bytes<'de>(pub &'de [u8]); |
153 | | |
154 | | impl<'de> Debug for Bytes<'de> { |
155 | 0 | fn fmt(&self, f: &mut Formatter) -> fmt::Result { |
156 | 0 | write_byte_string(f, self.0) |
157 | 0 | } |
158 | | } |
159 | | |
160 | | #[cfg(feature = "serialize")] |
161 | | impl<'de> Deserialize<'de> for Bytes<'de> { |
162 | | fn deserialize<D>(d: D) -> Result<Self, D::Error> |
163 | | where |
164 | | D: Deserializer<'de>, |
165 | | { |
166 | | struct ValueVisitor; |
167 | | |
168 | | impl<'de> Visitor<'de> for ValueVisitor { |
169 | | type Value = Bytes<'de>; |
170 | | |
171 | | fn expecting(&self, f: &mut Formatter) -> fmt::Result { |
172 | | f.write_str("borrowed bytes") |
173 | | } |
174 | | |
175 | | fn visit_borrowed_bytes<E: Error>(self, v: &'de [u8]) -> Result<Self::Value, E> { |
176 | | Ok(Bytes(v)) |
177 | | } |
178 | | } |
179 | | |
180 | | d.deserialize_bytes(ValueVisitor) |
181 | | } |
182 | | } |
183 | | |
184 | | #[cfg(feature = "serialize")] |
185 | | impl<'de> Serialize for Bytes<'de> { |
186 | | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
187 | | where |
188 | | S: Serializer, |
189 | | { |
190 | | serializer.serialize_bytes(self.0) |
191 | | } |
192 | | } |
193 | | |
194 | | //////////////////////////////////////////////////////////////////////////////////////////////////// |
195 | | |
196 | | #[cfg(test)] |
197 | | mod tests { |
198 | | use super::*; |
199 | | use pretty_assertions::assert_eq; |
200 | | |
201 | | #[test] |
202 | | fn write_byte_string0() { |
203 | | let bytes = ByteBuf(vec![10, 32, 32, 32, 32, 32, 32, 32, 32]); |
204 | | assert_eq!(format!("{:?}", bytes), "\"0xA \""); |
205 | | } |
206 | | |
207 | | #[test] |
208 | | fn write_byte_string1() { |
209 | | let bytes = ByteBuf(vec![ |
210 | | 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, |
211 | | 48, 48, 50, 47, 48, 55, 47, 111, 119, 108, 35, |
212 | | ]); |
213 | | assert_eq!( |
214 | | format!("{:?}", bytes), |
215 | | r##""http://www.w3.org/2002/07/owl#""## |
216 | | ); |
217 | | } |
218 | | |
219 | | #[test] |
220 | | fn write_byte_string3() { |
221 | | let bytes = ByteBuf(vec![ |
222 | | 67, 108, 97, 115, 115, 32, 73, 82, 73, 61, 34, 35, 66, 34, |
223 | | ]); |
224 | | assert_eq!(format!("{:?}", bytes), r##""Class IRI=\"#B\"""##); |
225 | | } |
226 | | } |