impl ftnet::Identity {
pub async fn create(identities_folder: &std::path::Path) -> eyre::Result<Self> {
use eyre::WrapErr;
let public_key = {
let mut rng = rand::rngs::OsRng;
let secret_key = iroh::SecretKey::generate(&mut rng);
ftnet::utils::save_secret(&secret_key)
.wrap_err_with(|| "failed to store secret key to keychain")?;
secret_key.public()
};
let now = std::time::SystemTime::now();
let unixtime = now
.duration_since(std::time::UNIX_EPOCH)
.wrap_err_with(|| "failed to get unix time")?
.as_secs();
let tmp_dir = identities_folder.join(format!("temp-{public_key}-{unixtime}"));
ftnet::utils::mkdir(&tmp_dir, "package")?;
ftnet::utils::mkdir(&tmp_dir, "package-template")?;
ftnet::utils::mkdir(&tmp_dir, "devices")?;
ftnet::utils::mkdir(&tmp_dir, "logs")?;
let dir = identities_folder.join(public_key.to_string());
std::fs::rename(&tmp_dir, dir)
.wrap_err_with(|| "failed to rename {tmp_dir:?} to {dir:?}")?;
Ok(Self { public_key })
}
}