use anyhow::Result;
use clap::Args;
use linkmarks_core::config as core_config;
use linkmarks_core::paths;
use linkmarks_core::store;
#[derive(Args, Debug)]
pub struct InitArgs {
#[arg(long)]
pub data_dir: Option<std::path::PathBuf>,
#[arg(long)]
pub config_dir: Option<std::path::PathBuf>,
#[arg(long)]
pub force: bool,
}
pub fn run(args: InitArgs, _format: crate::Format, paths: crate::Paths) -> Result<i32> {
let store_path = paths.store.clone();
let cfg_path = paths.config.clone();
let data_dir = args.data_dir.clone().unwrap_or_else(|| {
store_path
.parent()
.map(|p| p.to_path_buf())
.unwrap_or_else(paths::linkmarks_data_dir)
});
let config_dir = args.config_dir.clone().unwrap_or_else(|| {
cfg_path
.parent()
.map(|p| p.to_path_buf())
.unwrap_or_else(paths::linkmarks_config_dir)
});
std::fs::create_dir_all(&data_dir)
.map_err(|e| anyhow::anyhow!("create data dir {}: {e}", data_dir.display()))?;
std::fs::create_dir_all(&config_dir)
.map_err(|e| anyhow::anyhow!("create config dir {}: {e}", config_dir.display()))?;
let wrote_config = if args.force || !cfg_path.exists() {
if args.force && cfg_path.exists() {
let backup = cfg_path.with_extension("toml.bak");
let _ = std::fs::rename(&cfg_path, &backup);
}
std::fs::write(&cfg_path, core_config::DEFAULT_CONFIG_BODY)
.map_err(|e| anyhow::anyhow!("write default config: {e}"))?;
true
} else {
false
};
let _store = store::open(&store_path)
.map_err(|e| anyhow::anyhow!("open store {}: {e}", store_path.display()))?;
let _cfg = core_config::load_from(&cfg_path)
.map_err(|e| anyhow::anyhow!("parse config {}: {e}", cfg_path.display()))?;
println!(
"data_dir={}\nconfig_dir={}\nstore={}\nconfig_file={}\nconfig_written={}",
data_dir.display(),
config_dir.display(),
store_path.display(),
cfg_path.display(),
wrote_config,
);
Ok(crate::exit_codes::OK)
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn default_args_parse() {
let _ = InitArgs {
data_dir: None,
config_dir: None,
force: false,
};
}
#[test]
fn store_opens_against_arbitrary_data_dir() {
let dir = tempdir().unwrap();
let s = store::open(&dir.path().join("store.db")).unwrap();
assert_eq!(s.count().unwrap(), 0);
}
}