signet 0.0.1

code signing tool
Documentation
use std::path::PathBuf;
use anyhow::Error;
use crate::{Key, Keychain, Keystore, Metadata, Password, Provider};
use crate::persist::{Persistent, Store};
use crate::system::System;

pub struct Signet<S> {
    store: Store<S>,
}

impl<S: System> Signet<S> {
    pub fn new(root: PathBuf) -> Self {
        let store = Store::new(root);
        Self { store }
    }

    pub fn initialize(&self, password: Password) -> Result<(), Error> {
        self.store.initialize()?;

        let default  = "default";
        let keychain = Keychain::new(Metadata {
            identity: default.to_owned(),
            password: password,
        }, Provider::Local);

        let mut keystore = Keystore::default();
        keystore.insert(default);
        keystore.select(default)?;

        self.store.init(&keystore)?;
        self.store.init(&keychain)?;

        Ok(())
    }

    pub fn current(&self) -> Result<Keychain, Error> {
        let keystore = self.keystore()?;
        let current  = keystore.current()?;
        self.keychain(current)
    }

    pub fn find(&self, id: &str) -> Result<Key, Error> {
        let keychain = self.current()?;
        Ok(keychain.find(id)?.clone())
    }

    pub fn keystore(&self) -> Result<Keystore, Error> {
        Ok(self.store.keystore()?)
    }

    pub fn keychain(&self, name: &str) -> Result<Keychain, Error> {
        Ok(self.store.keychain(name)?)
    }

    pub fn sync<T: Persistent>(&self, data: &T) -> Result<(), Error> {
        Ok(self.store.sync(data)?)
    }
}