flmodules 0.10.0

Modules used in fledger
Documentation
use flarch::data_storage::DataStorage;
use flcrypto::{signer::Signer, signer_ed25519::SignerEd25519};
use serde::{Deserialize, Serialize};

use super::realm::RealmID;

#[derive(Serialize, Deserialize, Default)]
pub struct CryptoStorage {
    #[serde(skip)]
    ds: Option<Box<dyn DataStorage + Send>>,
    realm_id: RealmID,
    pub signers: Vec<Signer>,
}

const STORAGE_NAME: &str = "CryptoStorage";

impl CryptoStorage {
    pub fn new(ds: Box<dyn DataStorage + Send>) -> Self {
        Self {
            ds: Some(ds.clone()),
            ..serde_yaml::from_str(&ds.get(STORAGE_NAME).unwrap_or("".to_string()))
                .unwrap_or(CryptoStorage::default())
        }
    }

    pub fn get_signer(&mut self) -> Signer {
        if let Some(signer) = self.signers.first() {
            return (*signer).clone();
        }
        self.add_signer()
    }

    pub fn add_signer(&mut self) -> Signer {
        self.signers.push(SignerEd25519::new());
        self.store();
        self.get_signer()
    }

    pub fn store(&mut self) {
        let ser = serde_yaml::to_string(&self).unwrap_or("".to_string());
        self.ds.as_mut().map(|ds| ds.set(STORAGE_NAME, &ser));
    }
}