stratum_types/
stratum_error.rs1use 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}