sdk: impl `Signer` for all containers (#32181)

* impl signer for all containers

* trivial fixes

---------

Co-authored-by: hanako mumei <81144685+2501babe@users.noreply.github.com>
This commit is contained in:
cavemanloverboy 2023-07-24 12:54:33 -07:00 committed by GitHub
parent adc17fd1e0
commit ba7d892ebb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 1 deletions

View File

@ -2346,7 +2346,7 @@ mod tests {
Arc::new(validator_keypair),
&validator_ledger_path,
&voting_keypair.pubkey(),
Arc::new(RwLock::new(vec![voting_keypair.clone()])),
Arc::new(RwLock::new(vec![voting_keypair])),
vec![LegacyContactInfo::try_from(&leader_node.info).unwrap()],
&config,
true, // should_check_duplicate_instance

View File

@ -14,6 +14,7 @@ use {
error,
fs::{self, File, OpenOptions},
io::{Read, Write},
ops::Deref,
path::Path,
},
thiserror::Error,
@ -93,6 +94,29 @@ where
}
}
impl<Container: Deref<Target = impl Signer>> Signer for Container {
#[inline]
fn pubkey(&self) -> Pubkey {
self.deref().pubkey()
}
fn try_pubkey(&self) -> Result<Pubkey, SignerError> {
self.deref().try_pubkey()
}
fn sign_message(&self, message: &[u8]) -> Signature {
self.deref().sign_message(message)
}
fn try_sign_message(&self, message: &[u8]) -> Result<Signature, SignerError> {
self.deref().try_sign_message(message)
}
fn is_interactive(&self) -> bool {
self.deref().is_interactive()
}
}
impl PartialEq for dyn Signer {
fn eq(&self, other: &dyn Signer) -> bool {
self.pubkey() == other.pubkey()
@ -188,4 +212,41 @@ mod tests {
pubkeys(&[&alice, &bob])
);
}
#[test]
fn test_containers() {
use std::{rc::Rc, sync::Arc};
struct Foo<S: Signer> {
#[allow(unused)]
signer: S,
}
fn foo(_s: impl Signer) {}
let _arc_signer = Foo {
signer: Arc::new(Keypair::new()),
};
foo(Arc::new(Keypair::new()));
let _rc_signer = Foo {
signer: Rc::new(Keypair::new()),
};
foo(Rc::new(Keypair::new()));
let _ref_signer = Foo {
signer: &Keypair::new(),
};
foo(&Keypair::new());
let _box_signer = Foo {
signer: Box::new(Keypair::new()),
};
foo(Box::new(Keypair::new()));
let _signer = Foo {
signer: Keypair::new(),
};
foo(Keypair::new());
}
}