jsonrpc_types/v2/
version.rs

1use std::fmt;
2
3use serde::{de, ser};
4
5/// JSON-RPC Protocol Version.
6#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
7pub enum Version {
8    /// JSON-RPC 2.0
9    V2_0,
10}
11
12impl ser::Serialize for Version {
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: ser::Serializer,
16    {
17        match self {
18            Version::V2_0 => serializer.serialize_str("2.0"),
19        }
20    }
21}
22
23impl<'a> de::Deserialize<'a> for Version {
24    fn deserialize<D>(deserializer: D) -> Result<Version, D::Error>
25    where
26        D: de::Deserializer<'a>,
27    {
28        deserializer.deserialize_identifier(VersionVisitor)
29    }
30}
31
32struct VersionVisitor;
33impl<'a> de::Visitor<'a> for VersionVisitor {
34    type Value = Version;
35
36    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
37        formatter.write_str("a string")
38    }
39
40    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
41    where
42        E: de::Error,
43    {
44        match value {
45            "2.0" => Ok(Version::V2_0),
46            _ => Err(de::Error::custom("Invalid JSON-RPC protocol version")),
47        }
48    }
49}