steid

@jamesgill /

2.0 KBCode·Blame·Raw
0e162fdfeat: bootstrap_owner and login use cases1mo
1use crate::domain::{DomainError, repository::RepositoryError};
2
02eb2e4feat: GitStorage port and DiskGitStorage24d
3use super::port::{GitStorageError, PasswordError};
0e162fdfeat: bootstrap_owner and login use cases1mo
4
5/// What a use case can fail with.
6///
02eb2e4feat: GitStorage port and DiskGitStorage24d
7/// Keeps the failure sources distinct: a broken rule, broken storage, a broken hash,
8/// and a filesystem that would not cooperate are different problems with different
9/// responses, and flattening them makes a storage outage indistinguishable from a
10/// validation error.
0e162fdfeat: bootstrap_owner and login use cases1mo
11#[derive(Debug)]
12pub enum Error {
13 /// A domain rule was violated.
14 Domain(DomainError),
15 /// Persistence failed.
16 Repository(RepositoryError),
17 /// Hashing or verification failed for a reason other than a wrong password.
18 Password(PasswordError),
02eb2e4feat: GitStorage port and DiskGitStorage24d
19 /// A bare repository could not be created or removed on disk.
20 GitStorage(GitStorageError),
0e162fdfeat: bootstrap_owner and login use cases1mo
21}
22
23impl From<DomainError> for Error {
24 fn from(error: DomainError) -> Self {
25 Self::Domain(error)
26 }
27}
28
29impl From<RepositoryError> for Error {
30 fn from(error: RepositoryError) -> Self {
31 Self::Repository(error)
32 }
33}
34
35impl From<PasswordError> for Error {
36 fn from(error: PasswordError) -> Self {
37 Self::Password(error)
38 }
39}
40
02eb2e4feat: GitStorage port and DiskGitStorage24d
41impl From<GitStorageError> for Error {
42 fn from(error: GitStorageError) -> Self {
43 Self::GitStorage(error)
44 }
45}
46
0e162fdfeat: bootstrap_owner and login use cases1mo
47impl std::fmt::Display for Error {
48 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49 match self {
50 Self::Domain(error) => write!(f, "{error}"),
51 Self::Repository(error) => write!(f, "{error}"),
52 Self::Password(error) => write!(f, "{error}"),
02eb2e4feat: GitStorage port and DiskGitStorage24d
53 Self::GitStorage(error) => write!(f, "{error}"),
0e162fdfeat: bootstrap_owner and login use cases1mo
54 }
55 }
56}
57
58impl std::error::Error for Error {
59 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
60 match self {
61 Self::Domain(error) => Some(error),
62 Self::Repository(error) => Some(error),
63 Self::Password(error) => Some(error),
02eb2e4feat: GitStorage port and DiskGitStorage24d
64 Self::GitStorage(error) => Some(error),
0e162fdfeat: bootstrap_owner and login use cases1mo
65 }
66 }
67}
68
69pub type Result<T> = std::result::Result<T, Error>;