use serde::Deserialize;
use std::fmt;
#[derive(Deserialize, Debug)]
pub struct DuneError {
pub error: String,
}
#[derive(Debug, PartialEq)]
pub enum DuneRequestError {
Dune(String),
Request(String),
}
impl fmt::Display for DuneRequestError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DuneRequestError::Dune(msg) => write!(f, "Dune API error: {}", msg),
DuneRequestError::Request(msg) => write!(f, "request error: {}", msg),
}
}
}
impl std::error::Error for DuneRequestError {}
impl From<DuneError> for DuneRequestError {
fn from(value: DuneError) -> Self {
DuneRequestError::Dune(value.error)
}
}
impl From<reqwest::Error> for DuneRequestError {
fn from(value: reqwest::Error) -> Self {
DuneRequestError::Request(value.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn error_parsing() {
let err = reqwest::get("invalid-url").await.unwrap_err();
assert_eq!(
DuneRequestError::from(err),
DuneRequestError::Request("builder error".to_string())
);
assert_eq!(
DuneRequestError::from(DuneError {
error: "broken".to_string()
}),
DuneRequestError::Dune("broken".to_string())
)
}
#[test]
fn derive_debug() {
assert_eq!(
format!(
"{:?}",
DuneError {
error: "broken".to_string()
}
),
"DuneError { error: \"broken\" }"
);
}
}