1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
use std::result;
use std::fmt;
use serde::{de, ser};
use std_prelude::*;

use super::*;

// ##################################################
// # V2_0

impl ser::Serialize for V2_0 {
    fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
    where
        S: ser::Serializer,
    {
        serializer.serialize_str("2.0")
    }
}

impl fmt::Debug for V2_0 {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("\"2.0\"")
    }
}

impl de::Expected for V2_0 {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("\"2.0\"")
    }
}

struct V2_0Visitor;

impl<'de> de::Visitor<'de> for V2_0Visitor {
    type Value = V2_0;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("exactly \"2.0\"")
    }

    fn visit_str<E>(self, value: &str) -> result::Result<V2_0, E>
    where
        E: de::Error,
    {
        if value == "2.0" {
            Ok(V2_0)
        } else {
            Err(de::Error::invalid_value(de::Unexpected::Str(value), &V2_0))
        }
    }
}

impl<'de> de::Deserialize<'de> for V2_0 {
    fn deserialize<D>(deserializer: D) -> result::Result<V2_0, D::Error>
    where
        D: de::Deserializer<'de>,
    {
        deserializer.deserialize_str(V2_0Visitor)
    }
}

// ##################################################
// # ERROR CODE

impl ser::Serialize for ErrorCode {
    fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
    where
        S: ser::Serializer,
    {
        let value = match *self {
            ErrorCode::ParseError => -32700,
            ErrorCode::InvalidRequest => -32600,
            ErrorCode::MethodNotFound => -32601,
            ErrorCode::InvalidParams => -32602,
            ErrorCode::InternalError => -32603,
            ErrorCode::ServerError(value) => value,
        };
        serializer.serialize_i64(value)
    }
}

impl de::Expected for ErrorCode {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "{:?}", self)
    }
}

struct ErrorCodeVisitor;

impl<'de> de::Visitor<'de> for ErrorCodeVisitor {
    type Value = ErrorCode;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("A valid json-rpc error code")
    }

    fn visit_i64<E>(self, value: i64) -> result::Result<ErrorCode, E>
    where
        E: de::Error,
    {
        Ok(ErrorCode::from(value))
    }
}

impl<'de> de::Deserialize<'de> for ErrorCode {
    fn deserialize<D>(deserializer: D) -> result::Result<ErrorCode, D::Error>
    where
        D: de::Deserializer<'de>,
    {
        deserializer.deserialize_i64(ErrorCodeVisitor)
    }
}