1use crate::store::MarshalingError;
2use serde::{Serialize, Serializer};
3use std::error::Error as StdError;
4use std::result::Result as StdResult;
5
6pub type Result<T, E = Error> = StdResult<T, E>;
8
9pub type BoxResult<T> = StdResult<T, Box<dyn StdError>>;
11
12#[non_exhaustive]
14#[derive(thiserror::Error, Debug)]
15pub enum Error {
16 #[error(transparent)]
17 FailedToDeserialize(MarshalingError),
18
19 #[error(transparent)]
20 FailedToSerialize(MarshalingError),
21
22 #[error(transparent)]
23 Io(#[from] std::io::Error),
24
25 #[error(transparent)]
26 Json(#[from] serde_json::Error),
27
28 #[cfg(any(target_os = "android", target_os = "ios"))]
29 #[error(transparent)]
30 PluginInvoke(#[from] tauri::plugin::mobile::PluginInvokeError),
31
32 #[error(transparent)]
33 Tauri(#[from] tauri::Error),
34}
35
36impl Error {
37 pub const fn is_bad_rid(&self) -> bool {
38 matches!(self, Self::Tauri(tauri::Error::BadResourceId(_)))
39 }
40}
41
42impl Serialize for Error {
43 fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
44 where
45 S: Serializer,
46 {
47 serializer.serialize_str(self.to_string().as_str())
48 }
49}
50
51#[doc(hidden)]
52#[macro_export]
53macro_rules! io_err {
54 ($variant:ident) => {{
55 use $crate::Error;
56 use std::io::{Error as IoError, ErrorKind};
57 let err = IoError::from(ErrorKind::$variant);
58 Err(Error::Io(err))
59 }};
60 ($variant:ident, $($arg:tt)*) => {{
61 use $crate::Error;
62 use std::io::{Error as IoError, ErrorKind};
63 let err = IoError::new(ErrorKind::$variant, format!($($arg)*));
64 Err(Error::Io(err))
65 }};
66}