use crate::error;
use crate::sign::{parse_keypair, Sign};
use snafu::ResultExt;
use std::fmt::Debug;
use std::path::PathBuf;
use std::result::Result;
pub trait KeySource: Debug + Send + Sync {
fn as_sign(&self) -> Result<Box<dyn Sign>, Box<dyn std::error::Error + Send + Sync + 'static>>;
fn write(
&self,
value: &str,
key_id_hex: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>>;
}
#[derive(Debug)]
pub struct LocalKeySource {
pub path: PathBuf,
}
impl KeySource for LocalKeySource {
fn as_sign(&self) -> Result<Box<dyn Sign>, Box<dyn std::error::Error + Send + Sync + 'static>> {
let data = std::fs::read(&self.path).context(error::FileRead { path: &self.path })?;
Ok(Box::new(parse_keypair(&data)?))
}
fn write(
&self,
value: &str,
_key_id_hex: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
Ok(std::fs::write(&self.path, value.as_bytes())
.context(error::FileWrite { path: &self.path })?)
}
}