use crate::rust::lib_gen::{Module, ModuleDef, ModuleName};
use indoc::indoc;
pub fn error_gen() -> Module {
let code = indoc! { r#"
use bytes::Bytes;
#[derive(Debug, thiserror::Error)]
pub enum Error<T> {
#[error("{0}")]
Item(T),
#[error("Client error: {0}")]
Reqwest(reqwest::Error),
#[error("Invalid header value: {0}")]
ReqwestHeader(reqwest::header::InvalidHeaderValue),
#[error("Deserialization error: {0}")]
Serde(serde_json::Error),
#[error("Unexpected response - status {code}, data: {body}", body = "String::from_utf8_lossy(data.as_ref())")]
Unexpected {
code: u16,
data: Bytes,
}
}
impl<T> Error<T> {
pub fn unexpected(code: u16, data: Bytes) -> Error<T> {
Error::Unexpected { code, data }
}
}
impl<T> From<reqwest::Error> for Error<T> {
fn from(value: reqwest::Error) -> Self {
Error::Reqwest(value)
}
}
impl<T> From<serde_json::Error> for Error<T> {
fn from(value: serde_json::Error) -> Self {
Error::Serde(value)
}
}
impl<T> From<reqwest::header::InvalidHeaderValue> for Error<T> {
fn from(value: reqwest::header::InvalidHeaderValue) -> Self {
Error::ReqwestHeader(value)
}
}
"#};
Module {
def: ModuleDef {
name: ModuleName::new("error"),
exports: vec!["Error".to_string()],
},
code: code.to_string(),
}
}