use snafu::Snafu;
use crate::{core::token::id_token::IdTokenValidationError, grant::core::form::OAuth2FormError};
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum StartError<
AuthErr: crate::core::Error + 'static,
HttpErr: crate::core::Error + 'static,
HttpRespErr: crate::core::Error + 'static,
DPoPErr: crate::core::Error + 'static,
JarErr: crate::core::Error + 'static,
> {
#[snafu(display("Encoding of the request parameters failed"))]
EncodeUrlEncoded {
source: serde_html_form::ser::Error,
},
#[snafu(display("Failed to make PAR request"))]
ParRequest {
source: OAuth2FormError<HttpErr, HttpRespErr, DPoPErr>,
},
#[snafu(display("Failed to create JAR (JWT-secured authorization request)"))]
Jar {
source: JarErr,
},
#[snafu(display("Failed to get client authentication parameters"))]
ClientAuth {
source: AuthErr,
},
}
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum CompleteError<GrantErr: crate::core::Error + 'static> {
#[snafu(display("Failed to make token call"))]
Grant {
source: GrantErr,
},
#[snafu(display("Issuer mismatch: original = {}, callback = {}", original, callback))]
IssuerMismatch {
original: String,
callback: String,
},
#[snafu(display("State mismatch: original = {}, callback = {}", original, callback))]
StateMismatch {
original: String,
callback: String,
},
#[snafu(display(
"Authorization server claims to support issuer identification but no issuer returned."
))]
MissingIssuer,
#[snafu(display(
"ID token received but grant has no JWS verifier configured; provide a JWKS URI and verifier factory"
))]
IdTokenVerifierNotConfigured,
#[snafu(display(
"ID token received but grant has no issuer configured; provide an issuer via server metadata or builder"
))]
IdTokenIssuerNotConfigured,
#[snafu(display("ID token validation failed"))]
IdTokenValidation {
source: IdTokenValidationError,
},
}
impl<GrantErr: crate::core::Error + 'static> crate::core::Error for CompleteError<GrantErr> {
fn is_retryable(&self) -> bool {
match self {
CompleteError::Grant { source } => source.is_retryable(),
CompleteError::IssuerMismatch { .. }
| CompleteError::StateMismatch { .. }
| CompleteError::MissingIssuer
| CompleteError::IdTokenVerifierNotConfigured
| CompleteError::IdTokenIssuerNotConfigured
| CompleteError::IdTokenValidation { .. } => false,
}
}
}