atagen

macltok

public
Star0
Watch0
fa9114fcf75f7bdf1a7cec3b3367d604cf7de472
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/error.rs

96fdf90aacd6atagen2026-09-08 08:24 UTC1
use thiserror::Error;
96fdf90aacd6atagen2026-09-08 08:24 UTC2
96fdf90aacd6atagen2026-09-08 08:24 UTC3
use matrix_sdk::{
96fdf90aacd6atagen2026-09-08 08:24 UTC4
    HttpError, RefreshTokenError,
96fdf90aacd6atagen2026-09-08 08:24 UTC5
    authentication::oauth::error::{
96fdf90aacd6atagen2026-09-08 08:24 UTC6
        OAuthAuthorizationCodeError, OAuthDiscoveryError, OAuthError, OAuthTokenRevocationError,
96fdf90aacd6atagen2026-09-08 08:24 UTC7
        RequestTokenError,
96fdf90aacd6atagen2026-09-08 08:24 UTC8
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC9
    encryption::{
96fdf90aacd6atagen2026-09-08 08:24 UTC10
        identities::{ManualVerifyError, RequestVerificationError},
96fdf90aacd6atagen2026-09-08 08:24 UTC11
        recovery::RecoveryError,
96fdf90aacd6atagen2026-09-08 08:24 UTC12
        secret_storage::{ImportError, SecretStorageError},
96fdf90aacd6atagen2026-09-08 08:24 UTC13
    },
96fdf90aacd6atagen2026-09-08 08:24 UTC14
};
96fdf90aacd6atagen2026-09-08 08:24 UTC15
96fdf90aacd6atagen2026-09-08 08:24 UTC16
use crate::CommandErrorKind;
96fdf90aacd6atagen2026-09-08 08:24 UTC17
96fdf90aacd6atagen2026-09-08 08:24 UTC18
#[derive(Debug, Error)]
96fdf90aacd6atagen2026-09-08 08:24 UTC19
#[error("{message}")]
96fdf90aacd6atagen2026-09-08 08:24 UTC20
pub(crate) struct CommandError {
96fdf90aacd6atagen2026-09-08 08:24 UTC21
    pub(crate) kind: CommandErrorKind,
96fdf90aacd6atagen2026-09-08 08:24 UTC22
    message: String,
96fdf90aacd6atagen2026-09-08 08:24 UTC23
    #[source]
96fdf90aacd6atagen2026-09-08 08:24 UTC24
    source: Option<Box<dyn std::error::Error + Send + Sync>>,
96fdf90aacd6atagen2026-09-08 08:24 UTC25
}
96fdf90aacd6atagen2026-09-08 08:24 UTC26
96fdf90aacd6atagen2026-09-08 08:24 UTC27
impl CommandError {
96fdf90aacd6atagen2026-09-08 08:24 UTC28
    pub(crate) fn new(kind: CommandErrorKind, message: impl Into<String>) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC29
        Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC30
            kind,
96fdf90aacd6atagen2026-09-08 08:24 UTC31
            message: message.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC32
            source: None,
96fdf90aacd6atagen2026-09-08 08:24 UTC33
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC34
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC35
96fdf90aacd6atagen2026-09-08 08:24 UTC36
    pub(crate) fn with_source(
96fdf90aacd6atagen2026-09-08 08:24 UTC37
        kind: CommandErrorKind,
96fdf90aacd6atagen2026-09-08 08:24 UTC38
        message: impl Into<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC39
        source: impl std::error::Error + Send + Sync + 'static,
96fdf90aacd6atagen2026-09-08 08:24 UTC40
    ) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC41
        Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC42
            kind,
96fdf90aacd6atagen2026-09-08 08:24 UTC43
            message: message.into(),
96fdf90aacd6atagen2026-09-08 08:24 UTC44
            source: Some(Box::new(source)),
96fdf90aacd6atagen2026-09-08 08:24 UTC45
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC46
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC47
96fdf90aacd6atagen2026-09-08 08:24 UTC48
    pub(crate) fn from_sdk(message: impl Into<String>, source: matrix_sdk::Error) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC49
        Self::with_source(classify_sdk_error(&source), message, source)
96fdf90aacd6atagen2026-09-08 08:24 UTC50
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC51
96fdf90aacd6atagen2026-09-08 08:24 UTC52
    pub(crate) fn from_http(message: impl Into<String>, source: HttpError) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC53
        Self::with_source(classify_http_error(&source), message, source)
96fdf90aacd6atagen2026-09-08 08:24 UTC54
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC55
    pub(crate) fn from_refresh_token(
96fdf90aacd6atagen2026-09-08 08:24 UTC56
        message: impl Into<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC57
        source: RefreshTokenError,
96fdf90aacd6atagen2026-09-08 08:24 UTC58
    ) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC59
        Self::with_source(classify_refresh_token_error(&source), message, source)
96fdf90aacd6atagen2026-09-08 08:24 UTC60
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC61
96fdf90aacd6atagen2026-09-08 08:24 UTC62
    pub(crate) fn from_recovery(message: impl Into<String>, source: RecoveryError) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC63
        let kind = match &source {
96fdf90aacd6atagen2026-09-08 08:24 UTC64
            RecoveryError::Sdk(source) => classify_sdk_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC65
            RecoveryError::SecretStorage(SecretStorageError::Sdk(source)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC66
                classify_sdk_error(source)
96fdf90aacd6atagen2026-09-08 08:24 UTC67
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC68
            RecoveryError::SecretStorage(SecretStorageError::ImportError { error, .. }) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC69
                match error {
96fdf90aacd6atagen2026-09-08 08:24 UTC70
                    ImportError::Sdk(source) => classify_sdk_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC71
                    _ => CommandErrorKind::RecoveryRejected,
96fdf90aacd6atagen2026-09-08 08:24 UTC72
                }
96fdf90aacd6atagen2026-09-08 08:24 UTC73
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC74
            RecoveryError::SecretStorage(SecretStorageError::Verification(source)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC75
                match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC76
                    ManualVerifyError::Http(source) => classify_http_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC77
                    _ => CommandErrorKind::RecoveryRejected,
96fdf90aacd6atagen2026-09-08 08:24 UTC78
                }
96fdf90aacd6atagen2026-09-08 08:24 UTC79
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC80
            RecoveryError::SecretStorage(SecretStorageError::SecretStorageKey(_)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC81
                CommandErrorKind::RecoveryRejected
96fdf90aacd6atagen2026-09-08 08:24 UTC82
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC83
            RecoveryError::SecretStorage(SecretStorageError::Storage(_)) => CommandErrorKind::Store,
96fdf90aacd6atagen2026-09-08 08:24 UTC84
            RecoveryError::BackupExistsOnServer | RecoveryError::SecretStorage(_) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC85
                CommandErrorKind::RecoveryRejected
96fdf90aacd6atagen2026-09-08 08:24 UTC86
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC87
        };
96fdf90aacd6atagen2026-09-08 08:24 UTC88
        Self::with_source(kind, message, source)
96fdf90aacd6atagen2026-09-08 08:24 UTC89
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC90
96fdf90aacd6atagen2026-09-08 08:24 UTC91
    pub(crate) fn from_verification_request(
96fdf90aacd6atagen2026-09-08 08:24 UTC92
        message: impl Into<String>,
96fdf90aacd6atagen2026-09-08 08:24 UTC93
        source: RequestVerificationError,
96fdf90aacd6atagen2026-09-08 08:24 UTC94
    ) -> Self {
96fdf90aacd6atagen2026-09-08 08:24 UTC95
        let kind = match &source {
96fdf90aacd6atagen2026-09-08 08:24 UTC96
            RequestVerificationError::Sdk(source) => classify_sdk_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC97
            RequestVerificationError::RoomCreation(_) => CommandErrorKind::Encryption,
96fdf90aacd6atagen2026-09-08 08:24 UTC98
        };
96fdf90aacd6atagen2026-09-08 08:24 UTC99
        Self::with_source(kind, message, source)
96fdf90aacd6atagen2026-09-08 08:24 UTC100
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC101
}
96fdf90aacd6atagen2026-09-08 08:24 UTC102
96fdf90aacd6atagen2026-09-08 08:24 UTC103
pub(crate) fn classify_sdk_error(source: &matrix_sdk::Error) -> CommandErrorKind {
96fdf90aacd6atagen2026-09-08 08:24 UTC104
    match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC105
        matrix_sdk::Error::Http(source) => classify_http_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC106
        matrix_sdk::Error::OAuth(source) => classify_oauth_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC107
        matrix_sdk::Error::AuthenticationRequired => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC108
        matrix_sdk::Error::BadCryptoStoreState
96fdf90aacd6atagen2026-09-08 08:24 UTC109
        | matrix_sdk::Error::CryptoStoreError(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC110
        | matrix_sdk::Error::CrossProcessLockError(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC111
        | matrix_sdk::Error::StateStore(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC112
        | matrix_sdk::Error::EventCacheStore(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC113
        | matrix_sdk::Error::MediaStore(_) => CommandErrorKind::Store,
96fdf90aacd6atagen2026-09-08 08:24 UTC114
        matrix_sdk::Error::NoOlmMachine
96fdf90aacd6atagen2026-09-08 08:24 UTC115
        | matrix_sdk::Error::OlmError(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC116
        | matrix_sdk::Error::MegolmError(_)
96fdf90aacd6atagen2026-09-08 08:24 UTC117
        | matrix_sdk::Error::DecryptorError(_) => CommandErrorKind::Encryption,
96fdf90aacd6atagen2026-09-08 08:24 UTC118
        matrix_sdk::Error::Media(_) => CommandErrorKind::MediaUnavailable,
96fdf90aacd6atagen2026-09-08 08:24 UTC119
        matrix_sdk::Error::Timeout => CommandErrorKind::Network,
96fdf90aacd6atagen2026-09-08 08:24 UTC120
        _ => CommandErrorKind::Other,
96fdf90aacd6atagen2026-09-08 08:24 UTC121
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC122
}
96fdf90aacd6atagen2026-09-08 08:24 UTC123
96fdf90aacd6atagen2026-09-08 08:24 UTC124
fn classify_http_error(source: &HttpError) -> CommandErrorKind {
96fdf90aacd6atagen2026-09-08 08:24 UTC125
    match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC126
        HttpError::Reqwest(_) => CommandErrorKind::Network,
96fdf90aacd6atagen2026-09-08 08:24 UTC127
        HttpError::Api(_) => CommandErrorKind::Server,
96fdf90aacd6atagen2026-09-08 08:24 UTC128
        HttpError::RefreshToken(source) => classify_refresh_token_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC129
        HttpError::Cached(source) => classify_http_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC130
        _ => CommandErrorKind::Other,
96fdf90aacd6atagen2026-09-08 08:24 UTC131
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC132
}
96fdf90aacd6atagen2026-09-08 08:24 UTC133
96fdf90aacd6atagen2026-09-08 08:24 UTC134
fn classify_refresh_token_error(source: &RefreshTokenError) -> CommandErrorKind {
96fdf90aacd6atagen2026-09-08 08:24 UTC135
    match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC136
        RefreshTokenError::RefreshTokenRequired => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC137
        RefreshTokenError::MatrixAuth(source) => classify_http_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC138
        RefreshTokenError::OAuth(source) => classify_oauth_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC139
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC140
}
96fdf90aacd6atagen2026-09-08 08:24 UTC141
96fdf90aacd6atagen2026-09-08 08:24 UTC142
fn classify_oauth_error(source: &OAuthError) -> CommandErrorKind {
96fdf90aacd6atagen2026-09-08 08:24 UTC143
    let classify_token_request_error = |source: &_| match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC144
        RequestTokenError::Request(_) => CommandErrorKind::Network,
96fdf90aacd6atagen2026-09-08 08:24 UTC145
        RequestTokenError::ServerResponse(_) => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC146
        _ => CommandErrorKind::Other,
96fdf90aacd6atagen2026-09-08 08:24 UTC147
    };
96fdf90aacd6atagen2026-09-08 08:24 UTC148
    match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC149
        OAuthError::Discovery(source) => match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC150
            OAuthDiscoveryError::Http(source) => classify_http_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC151
            OAuthDiscoveryError::Oidc(source) => classify_token_request_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC152
            _ => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC153
        },
96fdf90aacd6atagen2026-09-08 08:24 UTC154
        OAuthError::RefreshToken(source) => classify_token_request_error(source),
96fdf90aacd6atagen2026-09-08 08:24 UTC155
        OAuthError::AuthorizationCode(OAuthAuthorizationCodeError::RequestToken(source)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC156
            classify_token_request_error(source)
96fdf90aacd6atagen2026-09-08 08:24 UTC157
        }
96fdf90aacd6atagen2026-09-08 08:24 UTC158
        OAuthError::AuthorizationCode(_) => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC159
        OAuthError::Logout(source) => match source {
96fdf90aacd6atagen2026-09-08 08:24 UTC160
            OAuthTokenRevocationError::Revoke(RequestTokenError::Request(_)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC161
                CommandErrorKind::Network
96fdf90aacd6atagen2026-09-08 08:24 UTC162
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC163
            OAuthTokenRevocationError::Revoke(RequestTokenError::ServerResponse(_)) => {
96fdf90aacd6atagen2026-09-08 08:24 UTC164
                CommandErrorKind::Unauthenticated
96fdf90aacd6atagen2026-09-08 08:24 UTC165
            }
96fdf90aacd6atagen2026-09-08 08:24 UTC166
            _ => CommandErrorKind::Other,
96fdf90aacd6atagen2026-09-08 08:24 UTC167
        },
96fdf90aacd6atagen2026-09-08 08:24 UTC168
        _ => CommandErrorKind::Unauthenticated,
96fdf90aacd6atagen2026-09-08 08:24 UTC169
    }
96fdf90aacd6atagen2026-09-08 08:24 UTC170
}