You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.5 KiB
95 lines
3.5 KiB
use gettextrs::gettext; |
|
use matrix_sdk::{ |
|
ruma::api::{ |
|
client::error::{ |
|
Error as ClientApiError, ErrorBody, |
|
ErrorKind::{Forbidden, LimitExceeded, UserDeactivated}, |
|
}, |
|
error::FromHttpResponseError, |
|
}, |
|
ClientBuildError, Error, HttpError, RumaApiError, |
|
}; |
|
use matrix_sdk_sled::OpenStoreError; |
|
|
|
use crate::ngettext_f; |
|
|
|
pub trait UserFacingError { |
|
fn to_user_facing(self) -> String; |
|
} |
|
|
|
impl UserFacingError for HttpError { |
|
fn to_user_facing(self) -> String { |
|
match self { |
|
HttpError::Reqwest(error) => { |
|
// TODO: Add more information based on the error |
|
if error.is_timeout() { |
|
gettext("The connection timed out. Try again later.") |
|
} else { |
|
gettext("Unable to connect to the homeserver.") |
|
} |
|
} |
|
HttpError::Api(FromHttpResponseError::Server(RumaApiError::ClientApi( |
|
ClientApiError { |
|
body: ErrorBody::Standard { kind, message }, |
|
.. |
|
}, |
|
))) => { |
|
match kind { |
|
Forbidden => gettext("The provided username or password is invalid."), |
|
UserDeactivated => gettext("The account is deactivated."), |
|
LimitExceeded { retry_after_ms } => { |
|
if let Some(ms) = retry_after_ms { |
|
let secs = ms.as_secs() as u32; |
|
ngettext_f( |
|
// Translators: Do NOT translate the content between '{' and '}', |
|
// this is a variable name. |
|
"You exceeded the homeserver’s rate limit, retry in 1 second.", |
|
"You exceeded the homeserver’s rate limit, retry in {n} seconds.", |
|
secs, |
|
&[("n", &secs.to_string())], |
|
) |
|
} else { |
|
gettext("You exceeded the homeserver’s rate limit, try again later.") |
|
} |
|
} |
|
_ => { |
|
// TODO: The server may not give us pretty enough error message. We should |
|
// add our own error message. |
|
message |
|
} |
|
} |
|
} |
|
_ => gettext("An unknown connection error occurred."), |
|
} |
|
} |
|
} |
|
|
|
impl UserFacingError for Error { |
|
fn to_user_facing(self) -> String { |
|
match self { |
|
Error::DecryptorError(_) => gettext("Could not decrypt the event"), |
|
Error::Http(http_error) => http_error.to_user_facing(), |
|
_ => gettext("An unknown error occurred."), |
|
} |
|
} |
|
} |
|
|
|
impl UserFacingError for OpenStoreError { |
|
fn to_user_facing(self) -> String { |
|
gettext("Could not open the store.") |
|
} |
|
} |
|
|
|
impl UserFacingError for ClientBuildError { |
|
fn to_user_facing(self) -> String { |
|
match self { |
|
ClientBuildError::Url(_) => gettext("This is not a valid URL"), |
|
ClientBuildError::AutoDiscovery(_) => { |
|
gettext("Homeserver auto-discovery failed. Try entering the full URL manually.") |
|
} |
|
ClientBuildError::Http(err) => err.to_user_facing(), |
|
ClientBuildError::SledStore(err) => err.to_user_facing(), |
|
_ => gettext("An unknown error occurred."), |
|
} |
|
} |
|
}
|
|
|