// use kxio::{net::Response, print::Printer}; use crate::{e, s}; #[derive(Debug)] pub(crate) struct APIResult where T: for<'a> serde::Deserialize<'a>, { pub(crate) text: String, pub(crate) result: Result, } impl APIResult where T: for<'a> serde::Deserialize<'a>, { pub async fn new(response: kxio::net::Result, 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::(&text) .map_err(|e| e.to_string()) .map_err(|e| { 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), } } }