use juiz_core::prelude::*;
use std::{io::Write, path::{Path, PathBuf}};
use std::fs::{create_dir, remove_dir, remove_file, rename, File};
use clap::Subcommand;
use crate::{Args, default_juiz_conf::default_conf};
#[derive(Debug, Subcommand, Clone)]
pub(crate) enum SetupSubCommands {
#[clap(arg_required_else_help = false)]
Home {
},
#[clap(arg_required_else_help = false)]
Cleanhome {
#[arg(short = 'f', help = "Force remove all. If not set, ${JUIZHOME}/conf/default.conf will be just renamed (not loaded by default.) ")]
force: bool
},
}
pub(crate) fn on_setup(_manifest: Value, subcommand: SetupSubCommands, _args: Args) -> JuizResult<()> {
match subcommand {
SetupSubCommands::Home {} => {
on_setup_home()
},
SetupSubCommands::Cleanhome {force} => {
on_setup_cleanhome(force)
}
}
}
fn on_setup_home() -> JuizResult<()> {
match home::home_dir() {
Some(homepath) => {
return create_juiz_home_dir(&homepath)
}
None => println!("Impossible to get your home dir!"),
}
return Ok(())
}
fn on_setup_cleanhome(force: bool) -> JuizResult<()> {
println!("cleanhome");
match home::home_dir() {
Some(homepath) => {
return remove_juiz_home_dir(&homepath, force)
}
None => println!("Impossible to get your home dir!"),
}
println!("cleanhome");
return Ok(())
}
fn create_juiz_home_dir(homepath: &Path) -> JuizResult<()> {
let juiz_homepath = homepath.join(".juiz");
if !juiz_homepath.exists() {
create_dir(juiz_homepath.clone())?;
}
setup_juiz_homepath(juiz_homepath)
}
fn remove_juiz_home_dir(homepath: &Path, force:bool) -> JuizResult<()> {
let juiz_homepath = homepath.join(".juiz");
if juiz_homepath.exists() {
cleanup_juiz_homepath(juiz_homepath.clone(), force)?;
}
if !force {
return Ok(());
}
Ok(remove_dir(juiz_homepath)?)
}
fn setup_juiz_homepath(juiz_homepath: std::path::PathBuf) -> JuizResult<()> {
let conf_path = juiz_homepath.join("conf");
if !conf_path.exists() {
create_dir(conf_path.clone())?;
}
let default_conf_filepath = conf_path.join("default.conf");
if !default_conf_filepath.exists() {
create_default_conf(default_conf_filepath)?;
}
let plugins_path = juiz_homepath.join("plugins");
if !plugins_path.exists() {
create_dir(plugins_path.clone())?;
}
let plugins_broker_factories_path = plugins_path.join("broker_factories");
if !plugins_broker_factories_path.exists() {
create_dir(plugins_broker_factories_path.clone())?;
}
Ok(())
}
fn create_default_conf(path: std::path::PathBuf) -> JuizResult<()> {
let mut file = File::create(path)?;
file.write(default_conf().as_bytes())?;
Ok(())
}
fn cleanup_juiz_homepath(juiz_homepath: std::path::PathBuf, force:bool) -> JuizResult<()> {
let conf_path = juiz_homepath.join("conf");
if conf_path.exists() {
let default_conf_filepath = conf_path.join("default.conf");
if default_conf_filepath.exists() {
if force {
remove_file(default_conf_filepath)?;
} else {
let new_filename_base = PathBuf::from(default_conf_filepath.to_str().unwrap().to_owned() + "_backup");
let mut new_filename = new_filename_base.clone();
let counter: i64 = 1;
while new_filename.exists() {
new_filename = PathBuf::from(new_filename_base.to_str().unwrap().to_owned() + counter.to_string().as_str());
}
rename(default_conf_filepath, new_filename)?;
return Ok(())
}
} else {
if !force {
return Ok(());
}
}
remove_dir(conf_path.clone())?;
}
let plugins_path = juiz_homepath.join("plugins");
if plugins_path.exists() {
let plugins_broker_factories_path = plugins_path.join("broker_factories");
if plugins_broker_factories_path.exists() {
remove_dir(plugins_broker_factories_path.clone())?;
}
remove_dir(plugins_path.clone())?;
}
Ok(())
}