stratum_types/
stratum_error.rs

1use serde::{ser::SerializeTuple, Deserialize, Deserializer, Serialize, Serializer};
2use std::fmt;
3
4#[derive(Debug)]
5pub enum StratumError {
6    Unknown(i32, String),
7    StaleShare,
8    DuplicateShare,
9    LowDifficultyShare,
10    Unauthorized,
11    NotSubscribed,
12    NodeSyncing,
13    Internal,
14    InvalidHeaderData,
15    TimeOutOfRange,
16    InvalidExtraNonce,
17}
18
19impl StratumError {
20    pub fn get_error_code(&self) -> i32 {
21        match *self {
22            StratumError::Unknown(code, _) => code,
23            StratumError::StaleShare => 21,
24            StratumError::DuplicateShare => 22,
25            StratumError::LowDifficultyShare => 23,
26            StratumError::Unauthorized => 24,
27            StratumError::NotSubscribed => 25,
28            StratumError::NodeSyncing => 26,
29            StratumError::Internal => 27,
30            StratumError::InvalidHeaderData => 28,
31            StratumError::TimeOutOfRange => 29,
32            StratumError::InvalidExtraNonce => 30,
33        }
34    }
35}
36
37impl fmt::Display for StratumError {
38    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39        match *self {
40            StratumError::Unknown(_, ref e) => write!(f, "Error: {}", e),
41            StratumError::StaleShare => write!(f, "Share submitted for old job"),
42            StratumError::DuplicateShare => write!(f, "Share already submitted"),
43            StratumError::LowDifficultyShare => write!(f, "Share too low difficulty"),
44            StratumError::Unauthorized => write!(f, "Miner is not authorized"),
45            StratumError::NotSubscribed => write!(f, "Miner is not subscribed"),
46            StratumError::NodeSyncing => write!(f, "Node is currently syncing. Please wait."),
47            StratumError::Internal => write!(f, "Internal Error. Please wait."),
48            StratumError::InvalidHeaderData => write!(f, "Header data in share is invalid."),
49            StratumError::TimeOutOfRange => {
50                write!(f, "Timestamp is outside of the acceptable range.")
51            }
52            StratumError::InvalidExtraNonce => write!(f, "Extranonce does not match provided."),
53        }
54    }
55}
56
57impl Serialize for StratumError {
58    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
59    where
60        S: Serializer,
61    {
62        let mut tup = serializer.serialize_tuple(2)?;
63        tup.serialize_element(&self.get_error_code())?;
64        tup.serialize_element(&self.to_string())?;
65        tup.end()
66    }
67}
68
69impl<'de> Deserialize<'de> for StratumError {
70    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
71    where
72        D: Deserializer<'de>,
73    {
74        Deserialize::deserialize(deserializer).map(|(c, n)| match c {
75            21 => StratumError::StaleShare,
76            22 => StratumError::DuplicateShare,
77            23 => StratumError::LowDifficultyShare,
78            24 => StratumError::Unauthorized,
79            25 => StratumError::NotSubscribed,
80            26 => StratumError::NodeSyncing,
81            27 => StratumError::Internal,
82            28 => StratumError::InvalidHeaderData,
83            29 => StratumError::TimeOutOfRange,
84            30 => StratumError::InvalidExtraNonce,
85            _ => StratumError::Unknown(c, n),
86        })
87    }
88}