use std::ops::Deref;
use solana_sdk::signature::read_keypair_file;
use solana_sdk::signer::keypair::Keypair;
#[allow(clippy::large_enum_variant)]
pub enum MaybeKeypair<'a> {
Owned(Keypair),
Borrowed(&'a Keypair),
}
impl Deref for MaybeKeypair<'_> {
type Target = Keypair;
fn deref(&self) -> &Keypair {
match self {
MaybeKeypair::Owned(keypair) => keypair,
MaybeKeypair::Borrowed(keypair) => keypair,
}
}
}
pub fn read_keypair_or(
path: Option<String>,
default: &Keypair,
) -> anyhow::Result<MaybeKeypair<'_>> {
match path {
Some(path) => read_keypair_file(&path)
.map(MaybeKeypair::Owned)
.map_err(|e| anyhow::anyhow!("failed to read keypair from {path}: {e}")),
None => Ok(MaybeKeypair::Borrowed(default)),
}
}