use log::info;
use crate::{
backend::WriteBackend,
chunker::rabin::random_poly,
commands::{
config::{ConfigOptions, save_config},
key::{KeyOptions, init_key},
},
crypto::aespoly1305::Key,
error::RusticResult,
id::Id,
repofile::{ConfigFile, KeyId, configfile::RepositoryId},
repository::{Repository, credentials::Credentials},
};
pub(crate) fn init<S>(
repo: &Repository<S>,
credentials: &Credentials,
key_opts: &KeyOptions,
config_opts: &ConfigOptions,
) -> RusticResult<(Key, Option<KeyId>, ConfigFile)> {
let repo_id = RepositoryId::from(Id::random());
let chunker_poly = random_poly()?;
let mut config = ConfigFile::new(2, repo_id, chunker_poly);
if repo.be_hot.is_some() {
config.is_hot = Some(true);
}
config_opts.apply(&mut config)?;
let (key, key_id) = init_with_config(repo, credentials, key_opts, &config)?;
info!("repository {repo_id} successfully created.");
Ok((key, key_id, config))
}
pub(crate) fn init_with_config<S>(
repo: &Repository<S>,
credentials: &Credentials,
key_opts: &KeyOptions,
config: &ConfigFile,
) -> RusticResult<(Key, Option<KeyId>)> {
repo.be.create()?;
let (key, id) = match credentials {
Credentials::Password(password) => {
let (key, id) = init_key(repo, key_opts, password)?;
info!("key {id} successfully added.");
(key, Some(id))
}
Credentials::Masterkey(key) => (key.key(), None),
};
save_config(repo, config.clone(), key)?;
Ok((key, id))
}