use std::{borrow::Cow, sync::Arc};
use crate::{
crypto::signer::{JwsSigner, JwsSignerSelector},
jwk::PublicJwk,
platform::MaybeSendBoxFuture,
};
pub trait AsymmetricJwsSignerSelector: JwsSignerSelector {
fn select_asymmetric_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn AsymmetricJwsSigner>>;
fn select_signer_by_thumbprint<'a>(
&'a self,
thumbprint: &'a str,
) -> MaybeSendBoxFuture<'a, Option<Arc<dyn AsymmetricJwsSigner>>>;
}
pub trait AsymmetricJwsSigner: JwsSigner {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk>;
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for &T {
fn select_asymmetric_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn AsymmetricJwsSigner>> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint<'a>(
&'a self,
thumbprint: &'a str,
) -> MaybeSendBoxFuture<'a, Option<Arc<dyn AsymmetricJwsSigner>>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for Box<T> {
fn select_asymmetric_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn AsymmetricJwsSigner>> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint<'a>(
&'a self,
thumbprint: &'a str,
) -> MaybeSendBoxFuture<'a, Option<Arc<dyn AsymmetricJwsSigner>>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for Arc<T> {
fn select_asymmetric_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn AsymmetricJwsSigner>> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint<'a>(
&'a self,
thumbprint: &'a str,
) -> MaybeSendBoxFuture<'a, Option<Arc<dyn AsymmetricJwsSigner>>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for &T {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for Box<T> {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for Arc<T> {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}