pub async fn init_if_required(dir: Option<String>) -> eyre::Result<std::path::PathBuf> {
use eyre::WrapErr;
let dir = match dir {
Some(dir) => dir.into(),
None => match directories::ProjectDirs::from("com", "FifthTry", "ftn") {
Some(dir) => dir.data_dir().to_path_buf(),
None => {
return Err(eyre::anyhow!(
"dotftn init failed: can not find data dir when dir is not provided"
));
}
},
};
if !dir.exists() {
tokio::fs::create_dir_all(&dir)
.await
.wrap_err_with(|| format!("failed to create dotftn directory: {dir:?}"))?;
let identities = ftnet::utils::mkdir(&dir, "identities")?;
ftnet::utils::mkdir(&dir, "logs")?;
super::lock_file(&dir).wrap_err_with(|| "failed to create lock file")?;
ftnet::Identity::create(&identities).await?;
}
Ok(dir)
}