Skip to main content

x12/
response.rs

1use std::fmt;
2
3use serde::{Deserialize, Serialize};
4use serde::{ser, de};
5use serde::de::{Error};
6
7#[derive(Clone, Copy, PartialEq, Debug)]
8pub enum Response {
9    Yes,
10    No,
11}
12
13impl Response {
14    pub fn code(&self) -> &str {
15        match self {
16            Response::Yes => "Y",
17            Response::No => "N",
18        }
19    }
20    pub fn value(&self) -> bool {
21        match self {
22            Response::Yes => true,
23            Response::No => false,
24        }
25    }
26}
27
28impl Serialize for Response  {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: ser::Serializer {
30        if serializer.is_human_readable() {
31            serializer.serialize_bool(self.value())
32        } else {
33            serializer.serialize_str(self.code())
34        }
35    }
36}
37
38struct Visitor;
39
40impl<'de> de::Visitor<'de> for Visitor {
41    type Value = Response;
42
43    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
44        formatter.write_str("a fixed length string")
45    }
46
47    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: Error {
48        if v == "Y" {
49            Ok(Response::Yes)
50        } else if v == "N" {
51            Ok(Response::No)
52        } else {
53            Err(E::custom("invalid response"))
54        }
55    }
56
57    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E> where E: Error {
58        if v {
59            Ok(Response::Yes)
60        } else {
61            Ok(Response::No)
62        }
63    }
64}
65
66impl<'de> Deserialize<'de> for Response {
67    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: de::Deserializer<'de> {
68        if deserializer.is_human_readable() {
69            deserializer.deserialize_bool(Visitor)
70        } else {
71            deserializer.deserialize_str(Visitor)
72        }
73    }
74}