fractal/src/user_facing_error.rs

89 lines
3.3 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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 homeservers rate limit, retry in 1 second.",
"You exceeded the homeservers rate limit, retry in {n} seconds.",
secs,
&[("n", &secs.to_string())],
)
} else {
gettext("You exceeded the homeservers rate limit, try again later.")
}
}
_ => {
// TODO: The server may not give us pretty enough error message. We should
// add our own error message.
message.clone()
}
}
}
_ => 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 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::SqliteStore(_) => gettext("Could not open the store."),
_ => gettext("An unknown error occurred."),
}
}
}