over_there/utils/serializers/
error_kind.rs

1use std::io;
2
3// Ported from https://github.com/mimblewimble/grin/blob/5e1fe44bedee3a48e3d0573a8ce5e4fd8f4e97c1/core/src/ser.rs
4
5// serializer for io::Errorkind, originally auto-generated by serde-derive
6// slightly modified to handle the #[non_exhaustive] tag on io::ErrorKind
7pub fn serialize<S>(
8    kind: &io::ErrorKind,
9    serializer: S,
10) -> serde::export::Result<S::Ok, S::Error>
11where
12    S: serde::Serializer,
13{
14    match *kind {
15        io::ErrorKind::NotFound => serde::Serializer::serialize_unit_variant(
16            serializer,
17            "ErrorKind",
18            0u32,
19            "NotFound",
20        ),
21        io::ErrorKind::PermissionDenied => {
22            serde::Serializer::serialize_unit_variant(
23                serializer,
24                "ErrorKind",
25                1u32,
26                "PermissionDenied",
27            )
28        }
29        io::ErrorKind::ConnectionRefused => {
30            serde::Serializer::serialize_unit_variant(
31                serializer,
32                "ErrorKind",
33                2u32,
34                "ConnectionRefused",
35            )
36        }
37        io::ErrorKind::ConnectionReset => {
38            serde::Serializer::serialize_unit_variant(
39                serializer,
40                "ErrorKind",
41                3u32,
42                "ConnectionReset",
43            )
44        }
45        io::ErrorKind::ConnectionAborted => {
46            serde::Serializer::serialize_unit_variant(
47                serializer,
48                "ErrorKind",
49                4u32,
50                "ConnectionAborted",
51            )
52        }
53        io::ErrorKind::NotConnected => {
54            serde::Serializer::serialize_unit_variant(
55                serializer,
56                "ErrorKind",
57                5u32,
58                "NotConnected",
59            )
60        }
61        io::ErrorKind::AddrInUse => serde::Serializer::serialize_unit_variant(
62            serializer,
63            "ErrorKind",
64            6u32,
65            "AddrInUse",
66        ),
67        io::ErrorKind::AddrNotAvailable => {
68            serde::Serializer::serialize_unit_variant(
69                serializer,
70                "ErrorKind",
71                7u32,
72                "AddrNotAvailable",
73            )
74        }
75        io::ErrorKind::BrokenPipe => serde::Serializer::serialize_unit_variant(
76            serializer,
77            "ErrorKind",
78            8u32,
79            "BrokenPipe",
80        ),
81        io::ErrorKind::AlreadyExists => {
82            serde::Serializer::serialize_unit_variant(
83                serializer,
84                "ErrorKind",
85                9u32,
86                "AlreadyExists",
87            )
88        }
89        io::ErrorKind::WouldBlock => serde::Serializer::serialize_unit_variant(
90            serializer,
91            "ErrorKind",
92            10u32,
93            "WouldBlock",
94        ),
95        io::ErrorKind::InvalidInput => {
96            serde::Serializer::serialize_unit_variant(
97                serializer,
98                "ErrorKind",
99                11u32,
100                "InvalidInput",
101            )
102        }
103        io::ErrorKind::InvalidData => {
104            serde::Serializer::serialize_unit_variant(
105                serializer,
106                "ErrorKind",
107                12u32,
108                "InvalidData",
109            )
110        }
111        io::ErrorKind::TimedOut => serde::Serializer::serialize_unit_variant(
112            serializer,
113            "ErrorKind",
114            13u32,
115            "TimedOut",
116        ),
117        io::ErrorKind::WriteZero => serde::Serializer::serialize_unit_variant(
118            serializer,
119            "ErrorKind",
120            14u32,
121            "WriteZero",
122        ),
123        io::ErrorKind::Interrupted => {
124            serde::Serializer::serialize_unit_variant(
125                serializer,
126                "ErrorKind",
127                15u32,
128                "Interrupted",
129            )
130        }
131        io::ErrorKind::Other => serde::Serializer::serialize_unit_variant(
132            serializer,
133            "ErrorKind",
134            16u32,
135            "Other",
136        ),
137        io::ErrorKind::UnexpectedEof => {
138            serde::Serializer::serialize_unit_variant(
139                serializer,
140                "ErrorKind",
141                17u32,
142                "UnexpectedEof",
143            )
144        }
145        // #[non_exhaustive] is used on the definition of ErrorKind for future compatability
146        // That means match statements always need to match on _.
147        // The downside here is that rustc won't be able to warn us if io::ErrorKind another
148        // field is added to io::ErrorKind
149        _ => serde::Serializer::serialize_unit_variant(
150            serializer,
151            "ErrorKind",
152            16u32,
153            "Other",
154        ),
155    }
156}
157
158// deserializer for io::Errorkind, originally auto-generated by serde-derive
159pub fn deserialize<'de, D>(
160    deserializer: D,
161) -> serde::export::Result<io::ErrorKind, D::Error>
162where
163    D: serde::Deserializer<'de>,
164{
165    #[allow(non_camel_case_types)]
166    enum Field {
167        field0,
168        field1,
169        field2,
170        field3,
171        field4,
172        field5,
173        field6,
174        field7,
175        field8,
176        field9,
177        field10,
178        field11,
179        field12,
180        field13,
181        field14,
182        field15,
183        field16,
184        field17,
185    }
186    struct FieldVisitor;
187    impl<'de> serde::de::Visitor<'de> for FieldVisitor {
188        type Value = Field;
189        fn expecting(
190            &self,
191            formatter: &mut serde::export::Formatter,
192        ) -> serde::export::fmt::Result {
193            serde::export::Formatter::write_str(formatter, "variant identifier")
194        }
195        fn visit_u64<E>(
196            self,
197            value: u64,
198        ) -> serde::export::Result<Self::Value, E>
199        where
200            E: serde::de::Error,
201        {
202            match value {
203                0u64 => serde::export::Ok(Field::field0),
204                1u64 => serde::export::Ok(Field::field1),
205                2u64 => serde::export::Ok(Field::field2),
206                3u64 => serde::export::Ok(Field::field3),
207                4u64 => serde::export::Ok(Field::field4),
208                5u64 => serde::export::Ok(Field::field5),
209                6u64 => serde::export::Ok(Field::field6),
210                7u64 => serde::export::Ok(Field::field7),
211                8u64 => serde::export::Ok(Field::field8),
212                9u64 => serde::export::Ok(Field::field9),
213                10u64 => serde::export::Ok(Field::field10),
214                11u64 => serde::export::Ok(Field::field11),
215                12u64 => serde::export::Ok(Field::field12),
216                13u64 => serde::export::Ok(Field::field13),
217                14u64 => serde::export::Ok(Field::field14),
218                15u64 => serde::export::Ok(Field::field15),
219                16u64 => serde::export::Ok(Field::field16),
220                17u64 => serde::export::Ok(Field::field17),
221                _ => serde::export::Err(serde::de::Error::invalid_value(
222                    serde::de::Unexpected::Unsigned(value),
223                    &"variant index 0 <= i < 18",
224                )),
225            }
226        }
227        fn visit_str<E>(
228            self,
229            value: &str,
230        ) -> serde::export::Result<Self::Value, E>
231        where
232            E: serde::de::Error,
233        {
234            match value {
235                "NotFound" => serde::export::Ok(Field::field0),
236                "PermissionDenied" => serde::export::Ok(Field::field1),
237                "ConnectionRefused" => serde::export::Ok(Field::field2),
238                "ConnectionReset" => serde::export::Ok(Field::field3),
239                "ConnectionAborted" => serde::export::Ok(Field::field4),
240                "NotConnected" => serde::export::Ok(Field::field5),
241                "AddrInUse" => serde::export::Ok(Field::field6),
242                "AddrNotAvailable" => serde::export::Ok(Field::field7),
243                "BrokenPipe" => serde::export::Ok(Field::field8),
244                "AlreadyExists" => serde::export::Ok(Field::field9),
245                "WouldBlock" => serde::export::Ok(Field::field10),
246                "InvalidInput" => serde::export::Ok(Field::field11),
247                "InvalidData" => serde::export::Ok(Field::field12),
248                "TimedOut" => serde::export::Ok(Field::field13),
249                "WriteZero" => serde::export::Ok(Field::field14),
250                "Interrupted" => serde::export::Ok(Field::field15),
251                "Other" => serde::export::Ok(Field::field16),
252                "UnexpectedEof" => serde::export::Ok(Field::field17),
253                _ => serde::export::Err(serde::de::Error::unknown_variant(
254                    value, VARIANTS,
255                )),
256            }
257        }
258        fn visit_bytes<E>(
259            self,
260            value: &[u8],
261        ) -> serde::export::Result<Self::Value, E>
262        where
263            E: serde::de::Error,
264        {
265            match value {
266                b"NotFound" => serde::export::Ok(Field::field0),
267                b"PermissionDenied" => serde::export::Ok(Field::field1),
268                b"ConnectionRefused" => serde::export::Ok(Field::field2),
269                b"ConnectionReset" => serde::export::Ok(Field::field3),
270                b"ConnectionAborted" => serde::export::Ok(Field::field4),
271                b"NotConnected" => serde::export::Ok(Field::field5),
272                b"AddrInUse" => serde::export::Ok(Field::field6),
273                b"AddrNotAvailable" => serde::export::Ok(Field::field7),
274                b"BrokenPipe" => serde::export::Ok(Field::field8),
275                b"AlreadyExists" => serde::export::Ok(Field::field9),
276                b"WouldBlock" => serde::export::Ok(Field::field10),
277                b"InvalidInput" => serde::export::Ok(Field::field11),
278                b"InvalidData" => serde::export::Ok(Field::field12),
279                b"TimedOut" => serde::export::Ok(Field::field13),
280                b"WriteZero" => serde::export::Ok(Field::field14),
281                b"Interrupted" => serde::export::Ok(Field::field15),
282                b"Other" => serde::export::Ok(Field::field16),
283                b"UnexpectedEof" => serde::export::Ok(Field::field17),
284                _ => {
285                    let value = &serde::export::from_utf8_lossy(value);
286                    serde::export::Err(serde::de::Error::unknown_variant(
287                        value, VARIANTS,
288                    ))
289                }
290            }
291        }
292    }
293    impl<'de> serde::Deserialize<'de> for Field {
294        #[inline]
295        fn deserialize<D>(
296            deserializer: D,
297        ) -> serde::export::Result<Self, D::Error>
298        where
299            D: serde::Deserializer<'de>,
300        {
301            serde::Deserializer::deserialize_identifier(
302                deserializer,
303                FieldVisitor,
304            )
305        }
306    }
307    struct Visitor<'de> {
308        marker: serde::export::PhantomData<io::ErrorKind>,
309        lifetime: serde::export::PhantomData<&'de ()>,
310    }
311    impl<'de> serde::de::Visitor<'de> for Visitor<'de> {
312        type Value = io::ErrorKind;
313        fn expecting(
314            &self,
315            formatter: &mut serde::export::Formatter,
316        ) -> serde::export::fmt::Result {
317            serde::export::Formatter::write_str(formatter, "enum io::ErrorKind")
318        }
319        fn visit_enum<A>(
320            self,
321            data: A,
322        ) -> serde::export::Result<Self::Value, A::Error>
323        where
324            A: serde::de::EnumAccess<'de>,
325        {
326            match match serde::de::EnumAccess::variant(data) {
327                serde::export::Ok(val) => val,
328                serde::export::Err(err) => {
329                    return serde::export::Err(err);
330                }
331            } {
332                (Field::field0, variant) => {
333                    match serde::de::VariantAccess::unit_variant(variant) {
334                        serde::export::Ok(val) => val,
335                        serde::export::Err(err) => {
336                            return serde::export::Err(err);
337                        }
338                    };
339                    serde::export::Ok(io::ErrorKind::NotFound)
340                }
341                (Field::field1, variant) => {
342                    match serde::de::VariantAccess::unit_variant(variant) {
343                        serde::export::Ok(val) => val,
344                        serde::export::Err(err) => {
345                            return serde::export::Err(err);
346                        }
347                    };
348                    serde::export::Ok(io::ErrorKind::PermissionDenied)
349                }
350                (Field::field2, variant) => {
351                    match serde::de::VariantAccess::unit_variant(variant) {
352                        serde::export::Ok(val) => val,
353                        serde::export::Err(err) => {
354                            return serde::export::Err(err);
355                        }
356                    };
357                    serde::export::Ok(io::ErrorKind::ConnectionRefused)
358                }
359                (Field::field3, variant) => {
360                    match serde::de::VariantAccess::unit_variant(variant) {
361                        serde::export::Ok(val) => val,
362                        serde::export::Err(err) => {
363                            return serde::export::Err(err);
364                        }
365                    };
366                    serde::export::Ok(io::ErrorKind::ConnectionReset)
367                }
368                (Field::field4, variant) => {
369                    match serde::de::VariantAccess::unit_variant(variant) {
370                        serde::export::Ok(val) => val,
371                        serde::export::Err(err) => {
372                            return serde::export::Err(err);
373                        }
374                    };
375                    serde::export::Ok(io::ErrorKind::ConnectionAborted)
376                }
377                (Field::field5, variant) => {
378                    match serde::de::VariantAccess::unit_variant(variant) {
379                        serde::export::Ok(val) => val,
380                        serde::export::Err(err) => {
381                            return serde::export::Err(err);
382                        }
383                    };
384                    serde::export::Ok(io::ErrorKind::NotConnected)
385                }
386                (Field::field6, variant) => {
387                    match serde::de::VariantAccess::unit_variant(variant) {
388                        serde::export::Ok(val) => val,
389                        serde::export::Err(err) => {
390                            return serde::export::Err(err);
391                        }
392                    };
393                    serde::export::Ok(io::ErrorKind::AddrInUse)
394                }
395                (Field::field7, variant) => {
396                    match serde::de::VariantAccess::unit_variant(variant) {
397                        serde::export::Ok(val) => val,
398                        serde::export::Err(err) => {
399                            return serde::export::Err(err);
400                        }
401                    };
402                    serde::export::Ok(io::ErrorKind::AddrNotAvailable)
403                }
404                (Field::field8, variant) => {
405                    match serde::de::VariantAccess::unit_variant(variant) {
406                        serde::export::Ok(val) => val,
407                        serde::export::Err(err) => {
408                            return serde::export::Err(err);
409                        }
410                    };
411                    serde::export::Ok(io::ErrorKind::BrokenPipe)
412                }
413                (Field::field9, variant) => {
414                    match serde::de::VariantAccess::unit_variant(variant) {
415                        serde::export::Ok(val) => val,
416                        serde::export::Err(err) => {
417                            return serde::export::Err(err);
418                        }
419                    };
420                    serde::export::Ok(io::ErrorKind::AlreadyExists)
421                }
422                (Field::field10, variant) => {
423                    match serde::de::VariantAccess::unit_variant(variant) {
424                        serde::export::Ok(val) => val,
425                        serde::export::Err(err) => {
426                            return serde::export::Err(err);
427                        }
428                    };
429                    serde::export::Ok(io::ErrorKind::WouldBlock)
430                }
431                (Field::field11, variant) => {
432                    match serde::de::VariantAccess::unit_variant(variant) {
433                        serde::export::Ok(val) => val,
434                        serde::export::Err(err) => {
435                            return serde::export::Err(err);
436                        }
437                    };
438                    serde::export::Ok(io::ErrorKind::InvalidInput)
439                }
440                (Field::field12, variant) => {
441                    match serde::de::VariantAccess::unit_variant(variant) {
442                        serde::export::Ok(val) => val,
443                        serde::export::Err(err) => {
444                            return serde::export::Err(err);
445                        }
446                    };
447                    serde::export::Ok(io::ErrorKind::InvalidData)
448                }
449                (Field::field13, variant) => {
450                    match serde::de::VariantAccess::unit_variant(variant) {
451                        serde::export::Ok(val) => val,
452                        serde::export::Err(err) => {
453                            return serde::export::Err(err);
454                        }
455                    };
456                    serde::export::Ok(io::ErrorKind::TimedOut)
457                }
458                (Field::field14, variant) => {
459                    match serde::de::VariantAccess::unit_variant(variant) {
460                        serde::export::Ok(val) => val,
461                        serde::export::Err(err) => {
462                            return serde::export::Err(err);
463                        }
464                    };
465                    serde::export::Ok(io::ErrorKind::WriteZero)
466                }
467                (Field::field15, variant) => {
468                    match serde::de::VariantAccess::unit_variant(variant) {
469                        serde::export::Ok(val) => val,
470                        serde::export::Err(err) => {
471                            return serde::export::Err(err);
472                        }
473                    };
474                    serde::export::Ok(io::ErrorKind::Interrupted)
475                }
476                (Field::field16, variant) => {
477                    match serde::de::VariantAccess::unit_variant(variant) {
478                        serde::export::Ok(val) => val,
479                        serde::export::Err(err) => {
480                            return serde::export::Err(err);
481                        }
482                    };
483                    serde::export::Ok(io::ErrorKind::Other)
484                }
485                (Field::field17, variant) => {
486                    match serde::de::VariantAccess::unit_variant(variant) {
487                        serde::export::Ok(val) => val,
488                        serde::export::Err(err) => {
489                            return serde::export::Err(err);
490                        }
491                    };
492                    serde::export::Ok(io::ErrorKind::UnexpectedEof)
493                }
494            }
495        }
496    }
497    const VARIANTS: &'static [&'static str] = &[
498        "NotFound",
499        "PermissionDenied",
500        "ConnectionRefused",
501        "ConnectionReset",
502        "ConnectionAborted",
503        "NotConnected",
504        "AddrInUse",
505        "AddrNotAvailable",
506        "BrokenPipe",
507        "AlreadyExists",
508        "WouldBlock",
509        "InvalidInput",
510        "InvalidData",
511        "TimedOut",
512        "WriteZero",
513        "Interrupted",
514        "Other",
515        "UnexpectedEof",
516    ];
517    serde::Deserializer::deserialize_enum(
518        deserializer,
519        "ErrorKind",
520        VARIANTS,
521        Visitor {
522            marker: serde::export::PhantomData::<io::ErrorKind>,
523            lifetime: serde::export::PhantomData,
524        },
525    )
526}