use std::{borrow::Cow, sync::Arc};
use crate::{
error::Error,
platform::{MaybeSendBoxFuture, MaybeSendSync},
};
pub trait JwsSignerSelector: std::fmt::Debug + MaybeSendSync {
fn select_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn JwsSigner>>;
}
pub trait JwsSigner: std::fmt::Debug + MaybeSendSync {
fn jws_algorithm(&self) -> Cow<'_, str>;
fn key_id(&self) -> Option<Cow<'_, str>>;
fn sign<'a>(&'a self, input: &'a [u8]) -> MaybeSendBoxFuture<'a, Result<Vec<u8>, Error>>;
}
impl<T: JwsSignerSelector + ?Sized> JwsSignerSelector for &T {
fn select_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn JwsSigner>> {
(**self).select_signer()
}
}
impl<T: JwsSignerSelector + ?Sized> JwsSignerSelector for Box<T> {
fn select_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn JwsSigner>> {
(**self).select_signer()
}
}
impl<T: JwsSignerSelector + ?Sized> JwsSignerSelector for Arc<T> {
fn select_signer(&self) -> MaybeSendBoxFuture<'_, Arc<dyn JwsSigner>> {
(**self).select_signer()
}
}
impl<T: JwsSigner + ?Sized> JwsSigner for &T {
fn jws_algorithm(&self) -> Cow<'_, str> {
(**self).jws_algorithm()
}
fn key_id(&self) -> Option<Cow<'_, str>> {
(**self).key_id()
}
fn sign<'a>(&'a self, input: &'a [u8]) -> MaybeSendBoxFuture<'a, Result<Vec<u8>, Error>> {
(**self).sign(input)
}
}
impl<T: JwsSigner + ?Sized> JwsSigner for Box<T> {
fn jws_algorithm(&self) -> Cow<'_, str> {
(**self).jws_algorithm()
}
fn key_id(&self) -> Option<Cow<'_, str>> {
(**self).key_id()
}
fn sign<'a>(&'a self, input: &'a [u8]) -> MaybeSendBoxFuture<'a, Result<Vec<u8>, Error>> {
(**self).sign(input)
}
}
impl<T: JwsSigner + ?Sized> JwsSigner for Arc<T> {
fn jws_algorithm(&self) -> Cow<'_, str> {
(**self).jws_algorithm()
}
fn key_id(&self) -> Option<Cow<'_, str>> {
(**self).key_id()
}
fn sign<'a>(&'a self, input: &'a [u8]) -> MaybeSendBoxFuture<'a, Result<Vec<u8>, Error>> {
(**self).sign(input)
}
}