app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

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:
Acrates/core/src/backup/error.rs | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acrates/core/src/backup/mod.rs | 3+++
Mcrates/core/src/lib.rs | 1+
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;