Skip to content

Commit 345f4f3

Browse files
committed
refactor(sqlite): Make Error more precise / useful
1 parent e12b9e3 commit 345f4f3

File tree

2 files changed

+37
-43
lines changed

2 files changed

+37
-43
lines changed

crates/matrix-sdk-sqlite/src/crypto_store.rs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -114,46 +114,41 @@ impl SqliteCryptoStore {
114114
})
115115
}
116116

117-
fn serialize_value(&self, value: &impl Serialize) -> Result<Vec<u8>, CryptoStoreError> {
118-
let serialized = rmp_serde::to_vec_named(value).map_err(CryptoStoreError::backend)?;
117+
fn serialize_value(&self, value: &impl Serialize) -> Result<Vec<u8>> {
118+
let serialized = rmp_serde::to_vec_named(value)?;
119119

120120
if let Some(key) = &self.store_cipher {
121-
let encrypted =
122-
key.encrypt_value_data(serialized).map_err(CryptoStoreError::backend)?;
123-
rmp_serde::to_vec_named(&encrypted).map_err(CryptoStoreError::backend)
121+
let encrypted = key.encrypt_value_data(serialized)?;
122+
Ok(rmp_serde::to_vec_named(&encrypted)?)
124123
} else {
125124
Ok(serialized)
126125
}
127126
}
128127

129-
fn deserialize_value<T: DeserializeOwned>(&self, value: &[u8]) -> Result<T, CryptoStoreError> {
128+
fn deserialize_value<T: DeserializeOwned>(&self, value: &[u8]) -> Result<T> {
130129
if let Some(key) = &self.store_cipher {
131-
let encrypted = rmp_serde::from_slice(value).map_err(CryptoStoreError::backend)?;
132-
let decrypted = key.decrypt_value_data(encrypted).map_err(CryptoStoreError::backend)?;
130+
let encrypted = rmp_serde::from_slice(value)?;
131+
let decrypted = key.decrypt_value_data(encrypted)?;
133132

134-
rmp_serde::from_slice(&decrypted).map_err(CryptoStoreError::backend)
133+
Ok(rmp_serde::from_slice(&decrypted)?)
135134
} else {
136-
rmp_serde::from_slice(value).map_err(CryptoStoreError::backend)
135+
Ok(rmp_serde::from_slice(value)?)
137136
}
138137
}
139138

140139
fn deserialize_pickled_inbound_group_session(
141140
&self,
142141
value: &[u8],
143142
backed_up: bool,
144-
) -> Result<PickledInboundGroupSession, CryptoStoreError> {
143+
) -> Result<PickledInboundGroupSession> {
145144
let mut pickle: PickledInboundGroupSession = self.deserialize_value(value)?;
146145
// backed_up SQL column is source of truth, backed_up field in pickle
147146
// needed for other stores though
148147
pickle.backed_up = backed_up;
149148
Ok(pickle)
150149
}
151150

152-
fn deserialize_key_request(
153-
&self,
154-
value: &[u8],
155-
sent_out: bool,
156-
) -> Result<GossipRequest, CryptoStoreError> {
151+
fn deserialize_key_request(&self, value: &[u8], sent_out: bool) -> Result<GossipRequest> {
157152
let mut request: GossipRequest = self.deserialize_value(value)?;
158153
// sent_out SQL column is source of truth, sent_out field in serialized value
159154
// needed for other stores though
@@ -689,7 +684,7 @@ impl CryptoStore for SqliteCryptoStore {
689684
}
690685

691686
for hash in &changes.message_hashes {
692-
let hash = rmp_serde::to_vec(hash).map_err(CryptoStoreError::backend)?;
687+
let hash = rmp_serde::to_vec(hash)?;
693688
txn.add_olm_hash(&hash)?;
694689
}
695690

@@ -844,7 +839,7 @@ impl CryptoStore for SqliteCryptoStore {
844839
.get_tracked_users()
845840
.await?
846841
.iter()
847-
.map(|value| self.deserialize_value(value))
842+
.map(|value| Ok(self.deserialize_value(value)?))
848843
.collect()
849844
}
850845

crates/matrix-sdk-sqlite/src/error.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,41 +51,40 @@ pub enum OpenStoreError {
5151
SaveCipher(#[source] rusqlite::Error),
5252
}
5353

54-
#[derive(Debug)]
54+
#[derive(Debug, Error)]
5555
pub(crate) enum Error {
56-
#[cfg(feature = "crypto-store")]
57-
Crypto(CryptoStoreError),
56+
#[error(transparent)]
5857
Sqlite(rusqlite::Error),
58+
#[error(transparent)]
5959
Pool(PoolError),
60+
#[error(transparent)]
61+
Encode(rmp_serde::encode::Error),
62+
#[error(transparent)]
63+
Decode(rmp_serde::decode::Error),
64+
#[error(transparent)]
65+
Encryption(matrix_sdk_store_encryption::Error),
6066
}
6167

62-
#[cfg(feature = "crypto-store")]
63-
impl From<CryptoStoreError> for Error {
64-
fn from(value: CryptoStoreError) -> Self {
65-
Self::Crypto(value)
66-
}
67-
}
68-
69-
impl From<rusqlite::Error> for Error {
70-
fn from(value: rusqlite::Error) -> Self {
71-
Self::Sqlite(value)
72-
}
68+
macro_rules! impl_from {
69+
( $ty:ty => $enum:ident::$variant:ident ) => {
70+
impl From<$ty> for $enum {
71+
fn from(value: $ty) -> Self {
72+
Self::$variant(value)
73+
}
74+
}
75+
};
7376
}
7477

75-
impl From<PoolError> for Error {
76-
fn from(value: PoolError) -> Self {
77-
Self::Pool(value)
78-
}
79-
}
78+
impl_from!(rusqlite::Error => Error::Sqlite);
79+
impl_from!(PoolError => Error::Pool);
80+
impl_from!(rmp_serde::encode::Error => Error::Encode);
81+
impl_from!(rmp_serde::decode::Error => Error::Decode);
82+
impl_from!(matrix_sdk_store_encryption::Error => Error::Encryption);
8083

8184
#[cfg(feature = "crypto-store")]
8285
impl From<Error> for CryptoStoreError {
83-
fn from(value: Error) -> Self {
84-
match value {
85-
Error::Crypto(c) => c,
86-
Error::Sqlite(b) => CryptoStoreError::backend(b),
87-
Error::Pool(b) => CryptoStoreError::backend(b),
88-
}
86+
fn from(e: Error) -> Self {
87+
CryptoStoreError::backend(e)
8988
}
9089
}
9190

0 commit comments

Comments
 (0)