tauri_store/
error.rs

1use crate::store::MarshalingError;
2use serde::{Serialize, Serializer};
3use std::error::Error as StdError;
4use std::result::Result as StdResult;
5
6/// A [`Result`](std::result::Result) type with [`Error`](crate::Error) as the error variant.
7pub type Result<T, E = Error> = StdResult<T, E>;
8
9/// A [`Result`](std::result::Result) type with a boxed error.
10pub type BoxResult<T> = StdResult<T, Box<dyn StdError>>;
11
12/// Runtime errors for the stores.
13#[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}