trello-to-deck/src/api_result.rs

47 lines
1.2 KiB
Rust
Raw Normal View History

//
2024-12-07 10:05:37 +00:00
use kxio::{net::Response, print::Printer};
use crate::{e, s};
2024-12-14 19:51:55 +00:00
#[derive(Debug)]
pub(crate) struct APIResult<T>
where
T: for<'a> serde::Deserialize<'a>,
{
pub(crate) text: String,
pub(crate) result: Result<T, kxio::Error>,
}
2024-12-14 19:51:55 +00:00
impl<T> APIResult<T>
where
T: for<'a> serde::Deserialize<'a>,
{
2024-12-07 10:05:37 +00:00
pub async fn new(response: kxio::net::Result<Response>, prt: &Printer) -> Self {
match response {
Ok(response) => {
let text = response.text().await.unwrap_or_default();
let text = if text.is_empty() { s!("null") } else { text };
let result = serde_json::from_str::<T>(&text)
.map_err(|e| e.to_string())
.map_err(|e| {
2024-12-07 10:05:37 +00:00
e!(prt, "{e}: {text}");
e
})
.map_err(kxio::net::Error::from)
.map_err(kxio::Error::from);
Self { text, result }
}
Err(e) => {
e!(prt, "err: {e:#?}");
Self::error(e.into())
}
}
}
pub fn error(err: kxio::Error) -> Self {
Self {
text: s!(""),
result: Err(err),
}
}
}