1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
macro_rules! throw {
($e:expr) => {
return Err(Into::into($e));
};
}
#[derive(Debug, thiserror::Error)]
pub enum ErrorKind {
#[error("Invalid login: {0}")]
InvalidLogin(InvalidLogin),
#[error("The `sync_status` column in DB has an illegal value: {0}")]
BadSyncStatus(u8),
#[error("A duplicate GUID is present: {0:?}")]
DuplicateGuid(String),
#[error("No record with guid exists (when one was required): {0:?}")]
NoSuchRecord(String),
#[error("The logins tables are not empty")]
NonEmptyTable,
#[error("The provided salt is invalid")]
InvalidSalt,
#[error("Error synchronizing: {0}")]
SyncAdapterError(#[from] sync15::Error),
#[error("Error parsing JSON data: {0}")]
JsonError(#[from] serde_json::Error),
#[error("Error executing SQL: {0}")]
SqlError(#[from] rusqlite::Error),
#[error("Error parsing URL: {0}")]
UrlParseError(#[from] url::ParseError),
#[error("{0}")]
Interrupted(#[from] interrupt_support::Interrupted),
#[error("Protobuf decode error: {0}")]
ProtobufDecodeError(#[from] prost::DecodeError),
}
error_support::define_error! {
ErrorKind {
(SyncAdapterError, sync15::Error),
(JsonError, serde_json::Error),
(UrlParseError, url::ParseError),
(SqlError, rusqlite::Error),
(InvalidLogin, InvalidLogin),
(Interrupted, interrupt_support::Interrupted),
(ProtobufDecodeError, prost::DecodeError),
}
}
#[derive(Debug, thiserror::Error)]
pub enum InvalidLogin {
#[error("Origin is empty")]
EmptyOrigin,
#[error("Password is empty")]
EmptyPassword,
#[error("Login already exists")]
DuplicateLogin,
#[error("Both `formSubmitUrl` and `httpRealm` are present")]
BothTargets,
#[error("Neither `formSubmitUrl` or `httpRealm` are present")]
NoTarget,
#[error("Login has illegal field: {field_info}")]
IllegalFieldValue { field_info: String },
}
impl Error {
pub fn label(&self) -> &'static str {
match self.kind() {
ErrorKind::BadSyncStatus(_) => "BadSyncStatus",
ErrorKind::DuplicateGuid(_) => "DuplicateGuid",
ErrorKind::NoSuchRecord(_) => "NoSuchRecord",
ErrorKind::NonEmptyTable => "NonEmptyTable",
ErrorKind::InvalidSalt => "InvalidSalt",
ErrorKind::SyncAdapterError(_) => "SyncAdapterError",
ErrorKind::JsonError(_) => "JsonError",
ErrorKind::UrlParseError(_) => "UrlParseError",
ErrorKind::SqlError(_) => "SqlError",
ErrorKind::Interrupted(_) => "Interrupted",
ErrorKind::InvalidLogin(desc) => match desc {
InvalidLogin::EmptyOrigin => "InvalidLogin::EmptyOrigin",
InvalidLogin::EmptyPassword => "InvalidLogin::EmptyPassword",
InvalidLogin::DuplicateLogin => "InvalidLogin::DuplicateLogin",
InvalidLogin::BothTargets => "InvalidLogin::BothTargets",
InvalidLogin::NoTarget => "InvalidLogin::NoTarget",
InvalidLogin::IllegalFieldValue { .. } => "InvalidLogin::IllegalFieldValue",
},
ErrorKind::ProtobufDecodeError(_) => "BufDecodeError",
}
}
}