commit f8d894a1d67ca17d4b1f15946be7e9432db2f7df
parent 43ee8f2e10bc26407a365bf14368c7924eb82569
Author: triesap <triesap@radroots.dev>
Date: Sun, 18 Jan 2026 23:30:41 +0000
app-core: add client backup error map
- add backup module scaffold to radroots-app-core
- define RadrootsClientBackupError with message mapping
- implement Display/Error for backup error enum
- cover backup error messages with unit tests
Diffstat:
3 files changed, 71 insertions(+), 0 deletions(-)
diff --git a/crates/core/src/backup/error.rs b/crates/core/src/backup/error.rs
@@ -0,0 +1,67 @@
+use std::fmt;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum RadrootsClientBackupError {
+ CryptoUndefined,
+ InvalidBundle,
+ DecodeFailure,
+ EncodeFailure,
+ ProviderMissing,
+}
+
+pub type RadrootsClientBackupErrorMessage = &'static str;
+
+impl RadrootsClientBackupError {
+ pub const fn message(self) -> RadrootsClientBackupErrorMessage {
+ match self {
+ RadrootsClientBackupError::CryptoUndefined => "error.client.backup.crypto_undefined",
+ RadrootsClientBackupError::InvalidBundle => "error.client.backup.invalid_bundle",
+ RadrootsClientBackupError::DecodeFailure => "error.client.backup.decode_failure",
+ RadrootsClientBackupError::EncodeFailure => "error.client.backup.encode_failure",
+ RadrootsClientBackupError::ProviderMissing => "error.client.backup.provider_missing",
+ }
+ }
+}
+
+impl fmt::Display for RadrootsClientBackupError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.write_str(self.message())
+ }
+}
+
+impl std::error::Error for RadrootsClientBackupError {}
+
+#[cfg(test)]
+mod tests {
+ use super::RadrootsClientBackupError;
+
+ #[test]
+ fn message_matches_spec() {
+ let cases = [
+ (
+ RadrootsClientBackupError::CryptoUndefined,
+ "error.client.backup.crypto_undefined",
+ ),
+ (
+ RadrootsClientBackupError::InvalidBundle,
+ "error.client.backup.invalid_bundle",
+ ),
+ (
+ RadrootsClientBackupError::DecodeFailure,
+ "error.client.backup.decode_failure",
+ ),
+ (
+ RadrootsClientBackupError::EncodeFailure,
+ "error.client.backup.encode_failure",
+ ),
+ (
+ RadrootsClientBackupError::ProviderMissing,
+ "error.client.backup.provider_missing",
+ ),
+ ];
+ for (err, expected) in cases {
+ assert_eq!(err.message(), expected);
+ assert_eq!(err.to_string(), expected);
+ }
+ }
+}
diff --git a/crates/core/src/backup/mod.rs b/crates/core/src/backup/mod.rs
@@ -0,0 +1,3 @@
+pub mod error;
+
+pub use error::{RadrootsClientBackupError, RadrootsClientBackupErrorMessage};
diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs
@@ -2,3 +2,4 @@
pub mod crypto;
pub mod cipher;
+pub mod backup;