Skip to main content

aion_store_libsql/
error.rs

1//! Mapping libSQL and serde errors into `StoreError`.
2
3use aion_store::StoreError;
4
5/// Map a libSQL driver error into the `StoreError::Backend` boundary variant.
6#[must_use]
7pub fn libsql_error(error: &libsql::Error) -> StoreError {
8    StoreError::Backend(error.to_string())
9}
10
11/// Map a JSON serialization or deserialization error into `StoreError::Serialization`.
12#[must_use]
13pub fn serde_json_error(error: &serde_json::Error) -> StoreError {
14    StoreError::Serialization(error.to_string())
15}
16
17#[cfg(test)]
18mod tests {
19    use aion_store::StoreError;
20
21    use super::{libsql_error, serde_json_error};
22
23    #[test]
24    fn maps_libsql_error_to_backend() -> Result<(), Box<dyn std::error::Error>> {
25        let error = libsql::Error::ConnectionFailed(String::from("database unavailable"));
26        let mapped = libsql_error(&error);
27
28        match mapped {
29            StoreError::Backend(message) => {
30                assert!(message.contains("database unavailable"));
31            }
32            other => return Err(format!("expected backend error, got {other:?}").into()),
33        }
34
35        Ok(())
36    }
37
38    #[test]
39    fn maps_serde_json_error_to_serialization() -> Result<(), Box<dyn std::error::Error>> {
40        let error = serde_json::from_str::<serde_json::Value>("{")
41            .map(|_| ())
42            .map_err(|e| serde_json_error(&e))
43            .err();
44
45        match error {
46            Some(StoreError::Serialization(message)) => {
47                assert!(message.contains("EOF") || message.contains("object"));
48            }
49            Some(other) => {
50                return Err(format!("expected serialization error, got {other:?}").into());
51            }
52            None => return Err("expected serde_json parsing to fail".into()),
53        }
54
55        Ok(())
56    }
57}