use crate::crypto::signer::{
AsymmetricJwsSigner, AsymmetricJwsSignerSelector, BoxedAsymmetricJwsSigner, JwsSignerSelector,
};
#[derive(Debug, Clone)]
pub struct MultiKeySigner<S: AsymmetricJwsSigner = BoxedAsymmetricJwsSigner> {
default: S,
additional: Vec<S>,
}
impl<S: AsymmetricJwsSigner> MultiKeySigner<S> {
#[must_use]
pub fn new(default: S, additional: Vec<S>) -> Self {
Self {
default,
additional,
}
}
}
impl<S: AsymmetricJwsSigner> JwsSignerSelector for MultiKeySigner<S> {
type Signer = S;
fn select_signer(&self) -> S {
self.default.clone()
}
}
impl<S: AsymmetricJwsSigner> AsymmetricJwsSignerSelector for MultiKeySigner<S> {
fn select_signer_by_thumbprint(&self, thumbprint: &str) -> Option<S> {
let all = std::iter::once(&self.default).chain(self.additional.iter());
for signer in all {
if signer.public_key_jwk().thumbprint() == thumbprint {
return Some(signer.clone());
}
}
None
}
}