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

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."),
}
}
}