#![forbid(missing_docs)]
use serde::{Deserialize, Deserializer, Serialize};
use thiserror::Error;
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum CBError {
#[error("http: {0}")]
Http(#[source] hyper::Error),
#[error("serde: {error}\n {data}")]
Serde {
#[source]
error: serde_json::Error,
data: String,
},
#[error("coinbase: {0:?}")]
Coinbase(CoinbaseError),
#[error("websocket: {0}")]
Websocket(WSError),
#[error("null")]
Null,
}
impl PartialEq for CBError {
fn eq(&self, other: &Self) -> bool {
match self {
CBError::Http(_) => false,
CBError::Serde { .. } => false,
CBError::Coinbase(s) => {
if let CBError::Coinbase(o) = other {
s == o
} else {
false
}
}
CBError::Websocket(_) => false,
CBError::Null => true,
}
}
}
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum WSError {
#[error("connect")]
Connect(#[source] tokio_tungstenite::tungstenite::Error),
#[error("send")]
Send(#[source] tokio_tungstenite::tungstenite::Error),
#[error("read")]
Read(#[source] tokio_tungstenite::tungstenite::Error),
}
impl<'de> Deserialize<'de> for WSError {
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
unimplemented!()
}
}
impl<'de> Deserialize<'de> for CBError {
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
unimplemented!()
}
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct CoinbaseError {
message: String,
}