tauri_plugin_fs_stream/
error.rs1use 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}