Development Documentation (main branch) - For stable release docs, see docs.rs/eidetica
Skip to main content

eidetica/account/
errors.rs

1//! Error types for the account system
2use thiserror::Error;
3
4use crate::entry::ID;
5
6#[derive(Error, Debug)]
7pub enum AccountError {
8    #[error("Invalid installation-local account state")]
9    InvalidLocalState,
10
11    #[error("Account not found: {username}")]
12    AccountNotFound { username: String },
13
14    #[error("Username already exists: {username}")]
15    LoginNameAlreadyExists { username: String },
16
17    #[error(
18        "Multiple accounts detected with username '{username}' ({count} found). This indicates a race condition during account creation. Manual intervention required."
19    )]
20    DuplicateAccountsDetected { username: String, count: usize },
21
22    #[error("Key not found: {key_id}")]
23    KeyNotFound { key_id: String },
24
25    #[error("Key already exists: {key_id}")]
26    KeyAlreadyExists { key_id: String },
27
28    #[error("Encryption failed: {reason}")]
29    EncryptionFailed { reason: String },
30
31    #[error("Decryption failed: {reason}")]
32    DecryptionFailed { reason: String },
33
34    #[error("Operation requires admin permission")]
35    InsufficientPermissions,
36
37    #[error("No admin key available for database: {database_id}")]
38    NoAdminKey { database_id: ID },
39
40    #[error("Database not tracked: {database_id}")]
41    DatabaseNotTracked { database_id: ID },
42
43    #[error("This account is not sharing database: {database_id}")]
44    DatabaseNotShared { database_id: ID },
45
46    #[error(
47        "Database handle lacks the account capability required to manage sharing: {database_id}"
48    )]
49    MissingDatabaseCapability { database_id: ID },
50
51    #[error("Database not found by name: {name}")]
52    DatabaseNotFoundByName { name: String },
53
54    #[error("Account disabled: {username}")]
55    AccountDisabled { username: String },
56
57    #[error("Invalid salt length: expected {expected}, got {actual}")]
58    InvalidSaltLength { expected: usize, actual: usize },
59
60    #[error("Invalid nonce length: expected {expected}, got {actual}")]
61    InvalidNonceLength { expected: usize, actual: usize },
62
63    #[error("No key found for database: {database_id}")]
64    NoKeyForDatabase { database_id: ID },
65
66    #[error("No SigKey mapping found for key {key_id} in database {database_id}")]
67    NoSigKeyMapping { key_id: String, database_id: ID },
68
69    #[error("No SigKey found for key {key_id} in database {database_id}")]
70    NoSigKeyFound { key_id: String, database_id: ID },
71
72    #[error(
73        "Database access pending for {database_id}: a key mapping exists but the database has no local data yet \
74         (the bootstrap request may be awaiting approval, or the database has not synced)"
75    )]
76    DatabaseAccessPending { database_id: ID },
77
78    #[error("Invalid key format: {reason}")]
79    InvalidKeyFormat { reason: String },
80
81    #[error("No keys available for account")]
82    NoKeysAvailable,
83
84    #[error("Duplicate store name in DatabaseBuilder: {name}")]
85    DuplicateBuilderStore { name: String },
86}
87
88impl AccountError {
89    /// Check if this error indicates a resource was not found.
90    pub fn is_not_found(&self) -> bool {
91        matches!(
92            self,
93            AccountError::AccountNotFound { .. }
94                | AccountError::KeyNotFound { .. }
95                | AccountError::DatabaseNotTracked { .. }
96                | AccountError::DatabaseNotFoundByName { .. }
97        )
98    }
99}