eidetica/account/
errors.rs1use 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 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}