use crate::{database::db::borrow_db_checked, error::remote_access_error::RemoteAccessError}; use cacache::Integrity; use http::{header::CONTENT_TYPE, response::Builder as ResponseBuilder, Response}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_binary::binary_stream::Endian; use tauri::{UriSchemeContext, UriSchemeResponder}; use super::{auth::generate_authorization_header, requests::make_request}; #[macro_export] macro_rules! offline { ($var:expr, $func1:expr, $func2:expr, $( $arg:expr ),* ) => { if crate::borrow_db_checked().settings.force_offline || $var.lock().unwrap().status == crate::AppStatus::Offline { $func2( $( $arg ), *) } else { $func1( $( $arg ), *) } } } pub fn cache_object<'a, K: AsRef, D: Serialize + DeserializeOwned>( key: K, data: &D, ) -> Result { let bytes = serde_binary::to_vec(data, Endian::Little).unwrap(); cacache::write_sync(&borrow_db_checked().cache_dir, key, bytes) .map_err(|e| RemoteAccessError::Cache(e)) } pub fn get_cached_object<'a, K: AsRef, D: Serialize + DeserializeOwned>( key: K, ) -> Result { let bytes = cacache::read_sync(&borrow_db_checked().cache_dir, key) .map_err(|e| RemoteAccessError::Cache(e))?; let data = serde_binary::from_slice::(&bytes, Endian::Little).unwrap(); Ok(data) } #[derive(Serialize, Deserialize)] pub struct ObjectCache { content_type: String, body: Vec, } impl From>> for ObjectCache { fn from(value: Response>) -> Self { ObjectCache { content_type: value .headers() .get(CONTENT_TYPE) .unwrap() .to_str() .unwrap() .to_owned(), body: value.body().clone(), } } } impl From for Response> { fn from(value: ObjectCache) -> Self { let resp_builder = ResponseBuilder::new().header(CONTENT_TYPE, value.content_type); resp_builder.body(value.body).unwrap() } }