use async_trait::async_trait;
use thiserror::Error;
use crate::keys::{KeyInfo, KeyRef, Scheme, Signature, Subject};
use crate::payload::Payload;
#[async_trait]
pub trait KeySigner: Send + Sync {
async fn create_key(
&self,
subject: &Subject,
scheme: Scheme,
label: &str,
) -> Result<KeyInfo, SignerError>;
async fn key(&self, key_ref: &KeyRef) -> Result<KeyInfo, SignerError>;
async fn sign(&self, key_ref: &KeyRef, payload: &Payload) -> Result<Signature, SignerError>;
}
#[async_trait]
impl<T: KeySigner + ?Sized> KeySigner for &T {
async fn create_key(
&self,
subject: &Subject,
scheme: Scheme,
label: &str,
) -> Result<KeyInfo, SignerError> {
(**self).create_key(subject, scheme, label).await
}
async fn key(&self, key_ref: &KeyRef) -> Result<KeyInfo, SignerError> {
(**self).key(key_ref).await
}
async fn sign(&self, key_ref: &KeyRef, payload: &Payload) -> Result<Signature, SignerError> {
(**self).sign(key_ref, payload).await
}
}
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum SignerError {
#[error("the policy denied this signature: {reason}")]
Denied {
reason: String,
},
#[error("unknown key `{key_ref}`")]
UnknownKey {
key_ref: String,
},
#[error("unsupported: {reason}")]
Unsupported {
reason: String,
},
#[error("invalid input: {0}")]
Invalid(String),
#[error("the payload could not be processed: {0}")]
Payload(String),
#[error("the signer provider failed: {0}")]
Provider(String),
#[error("the audit trail refused, so the signature did not happen: {0}")]
Audit(String),
}