use crate::{
AccessTokenValidator,
core::platform::{MaybeSendBoxFuture, MaybeSendSync},
validator::{
ValidationResult,
metadata::{ProvideValidatorMetadata, ValidatorMetadata},
multi_issuer::error::MultiIssuerError,
},
};
pub(super) trait SourceValidator<C>:
AccessTokenValidator<Claims = C, Error = MultiIssuerError> + ProvideValidatorMetadata
{
}
impl<C, T> SourceValidator<C> for T where
T: AccessTokenValidator<Claims = C, Error = MultiIssuerError> + ProvideValidatorMetadata
{
}
pub(super) struct FoldError<V>(pub(super) V);
impl<V, C> AccessTokenValidator for FoldError<V>
where
V: AccessTokenValidator<Claims = C>,
V::Error: 'static,
C: MaybeSendSync,
{
type Claims = C;
type Error = MultiIssuerError;
fn validate_request<'a>(
&'a self,
headers: &'a http::HeaderMap,
method: &'a http::Method,
uri: &'a http::Uri,
client_cert_der: Option<&'a [u8]>,
) -> MaybeSendBoxFuture<'a, ValidationResult<C, MultiIssuerError>> {
Box::pin(async move {
let result = self
.0
.validate_request(headers, method, uri, client_cert_der)
.await;
ValidationResult {
outcome: result
.outcome
.map_err(|e| MultiIssuerError::Validation { error: Box::new(e) }),
dpop_nonce: result.dpop_nonce,
}
})
}
}
impl<V: ProvideValidatorMetadata> ProvideValidatorMetadata for FoldError<V> {
fn validator_metadata(&self, resource: Option<&str>) -> ValidatorMetadata {
self.0.validator_metadata(resource)
}
}