use std::future::Future;
use std::pin::Pin;
use super::{MessageSignatureBase, MessageSignatureError};
pub trait MessageSignatureSigner: Send + Sync + 'static {
fn sign(&self, signature_base: &[u8]) -> Result<Vec<u8>, MessageSignatureError>;
}
impl<F> MessageSignatureSigner for F
where
F: Fn(&[u8]) -> Result<Vec<u8>, MessageSignatureError> + Send + Sync + 'static,
{
fn sign(&self, signature_base: &[u8]) -> Result<Vec<u8>, MessageSignatureError> {
self(signature_base)
}
}
pub type MessageSignatureAsyncSigningFuture =
Pin<Box<dyn Future<Output = Result<Vec<u8>, MessageSignatureError>> + Send + 'static>>;
pub trait MessageSignatureAsyncSigner: Send + Sync + 'static {
fn sign(&self, signature_base: MessageSignatureBase) -> MessageSignatureAsyncSigningFuture;
}
impl<F, Fut> MessageSignatureAsyncSigner for F
where
F: Fn(MessageSignatureBase) -> Fut + Send + Sync + 'static,
Fut: Future<Output = Result<Vec<u8>, MessageSignatureError>> + Send + 'static,
{
fn sign(&self, signature_base: MessageSignatureBase) -> MessageSignatureAsyncSigningFuture {
Box::pin(self(signature_base))
}
}
pub type MessageSignatureLocalAsyncSigningFuture =
Pin<Box<dyn Future<Output = Result<Vec<u8>, MessageSignatureError>> + 'static>>;
pub trait MessageSignatureLocalAsyncSigner: Send + Sync + 'static {
fn sign_local(
&self,
signature_base: MessageSignatureBase,
) -> MessageSignatureLocalAsyncSigningFuture;
}
impl<F, Fut> MessageSignatureLocalAsyncSigner for F
where
F: Fn(MessageSignatureBase) -> Fut + Send + Sync + 'static,
Fut: Future<Output = Result<Vec<u8>, MessageSignatureError>> + 'static,
{
fn sign_local(
&self,
signature_base: MessageSignatureBase,
) -> MessageSignatureLocalAsyncSigningFuture {
Box::pin(self(signature_base))
}
}