pooly 0.2.1

A protobuf to Postgres adapter + connection pooling middleware.
Documentation
use std::sync::Arc;

use crate::{JwtAuthService, LocalSecretsService, MasterKeySharesService, UpdatableService};
use crate::models::errors::InitializationError;
use crate::models::auth::jwt::JwtKey;
use crate::models::sec::secrets::MasterKeySharePayload;

pub struct InitializationService {

    auth_service: Arc<JwtAuthService>,
    shares_service: Arc<MasterKeySharesService>,
    secrets_service: Arc<LocalSecretsService>,

}

impl InitializationService {

    pub fn new(auth_service: Arc<JwtAuthService>,
               shares_service: Arc<MasterKeySharesService>,
               secrets_service: Arc<LocalSecretsService>) -> InitializationService {
        InitializationService {
            auth_service,
            shares_service,
            secrets_service
        }
    }

    pub fn initialize(&self,
                      jwt_key: JwtKey) -> Result<Vec<MasterKeySharePayload>, InitializationError> {
        let shares = self.secrets_service.initialize()?;

        self.shares_service.add_all(&shares).map_err(|_| InitializationError::TooManyShares)?;

        self.secrets_service.unseal()?;

        self.auth_service.create(jwt_key)?;

        Ok(shares.into_iter().map(|share| share.into()).collect())
    }

    pub fn clear(&self) -> Result<(), InitializationError> {
        self.secrets_service.clear()?;

        self.auth_service.clear().map_err(|_| InitializationError::AuthClearError)?;

        self.shares_service.clear();

        Ok(())
    }

}