Skip to main content

tauri_plugin_fs_stream/
error.rs

1use std::borrow::Cow;
2use serde::{ser::Serializer, Serialize};
3
4
5pub type Result<T> = std::result::Result<T, Error>;
6
7#[derive(Debug, thiserror::Error)]
8#[error(transparent)]
9pub struct Error {
10    inner: InnerError
11}
12
13#[allow(unused)]
14impl crate::Error {
15
16    pub fn with(msg: impl Into<Cow<'static, str>>) -> Self {
17        Self { inner: InnerError::Raw(msg.into()) }
18    }
19
20    pub fn missing_value(value_name: impl std::fmt::Display) -> Self {
21        Self::with(format!("missing value: {value_name}"))
22    }
23
24    pub fn invalid_type(value_name: impl std::fmt::Display) -> Self {
25        Self::with(format!("invalid type for {value_name}"))
26    }
27
28    pub fn invalid_value(value_name: impl std::fmt::Display, value: impl std::fmt::Display) -> Self {
29        Self::with(format!("invalid value: {value} for {value_name}"))
30    }
31}
32
33impl From<crate::Error> for std::io::Error {
34
35    fn from(e: crate::Error) -> std::io::Error {
36        match e.inner {
37            InnerError::Io(e) => e,
38            e => std::io::Error::new(std::io::ErrorKind::Other, e)
39        }
40    }
41}
42
43impl From<crate::Error> for tauri::Error {
44
45    fn from(e: crate::Error) -> tauri::Error {
46        match e.inner {
47            InnerError::Tauri(e) => e,
48            InnerError::Io(e) => tauri::Error::Io(e),
49
50            #[cfg(target_os = "android")]
51            InnerError::PluginInvoke(e) => tauri::Error::PluginInvoke(e),
52
53            e => tauri::Error::Anyhow(e.into()),
54        }
55    }
56}
57
58
59#[derive(Debug, thiserror::Error)]
60enum InnerError {
61    #[error("{0}")]
62    Raw(Cow<'static, str>),
63
64    #[error(transparent)]
65    Io(std::io::Error),
66
67    #[error(transparent)]
68    Utf8(std::str::Utf8Error),
69
70    #[error(transparent)]
71    ParseInt(std::num::ParseIntError),
72
73    #[error(transparent)]
74    Tauri(tauri::Error),
75
76    #[error(transparent)]
77    TauriHttpHeaderToStr(tauri::http::header::ToStrError),
78
79    #[error(transparent)]
80    SerdeJson(serde_json::Error),
81
82    #[error(transparent)]
83    Base64Decode(base64::DecodeError)
84}
85
86macro_rules! impl_into_err_from_inner {
87    ($from:ty, $e:pat => $a:expr) => {
88        impl From<$from> for crate::Error {
89            fn from($e: $from) -> crate::Error {
90                $a
91            }
92        }
93    };
94}
95
96impl_into_err_from_inner!(std::io::Error, e => crate::Error { inner: InnerError::Io(e) });
97impl_into_err_from_inner!(std::str::Utf8Error, e => crate::Error { inner: InnerError::Utf8(e) });
98impl_into_err_from_inner!(std::num::ParseIntError, e => crate::Error { inner: InnerError::ParseInt(e) });
99impl_into_err_from_inner!(tauri::Error, e => crate::Error { inner: InnerError::Tauri(e) });
100impl_into_err_from_inner!(tauri::http::header::ToStrError, e => crate::Error { inner: InnerError::TauriHttpHeaderToStr(e) });
101impl_into_err_from_inner!(serde_json::Error, e => crate::Error { inner: InnerError::SerdeJson(e) });
102impl_into_err_from_inner!(base64::DecodeError, e => crate::Error { inner: InnerError::Base64Decode(e) });
103
104impl<T> From<std::sync::PoisonError<T>> for crate::Error {
105
106    fn from(_: std::sync::PoisonError<T>) -> crate::Error {
107        crate::Error::with("thread poisoned")
108    }
109}
110
111impl Serialize for crate::Error {
112
113    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
114    where
115        S: Serializer,
116    {
117        match &self.inner {
118            InnerError::Raw(msg) => serializer.serialize_str(&msg),
119            e => serializer.serialize_str(&e.to_string())
120        }
121    }
122}