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}