use crate::Result;
use serde::{Deserialize, Serialize};
use std::fs;
use tracing::info;
#[derive(Debug, Serialize, Deserialize)]
struct BioVaultConfig {
email: String,
}
pub async fn execute(email: &str) -> Result<()> {
let home_dir = if let Ok(test_home) = std::env::var("BIOVAULT_TEST_HOME") {
std::path::PathBuf::from(test_home)
} else {
dirs::home_dir().ok_or_else(|| anyhow::anyhow!("Could not determine home directory"))?
};
let biovault_dir = home_dir.join(".biovault");
if !biovault_dir.exists() {
fs::create_dir_all(&biovault_dir)?;
info!("Created directory: {:?}", biovault_dir);
}
let config_file = biovault_dir.join("config.yaml");
if config_file.exists() {
println!(
"Configuration file already exists at: {}",
config_file.display()
);
println!("Skipping initialization.");
} else {
let config = BioVaultConfig {
email: email.to_string(),
};
let yaml_content = serde_yaml::to_string(&config)?;
fs::write(&config_file, yaml_content)?;
println!("✓ BioVault initialized successfully!");
println!(" Configuration saved to: {}", config_file.display());
println!(" Email: {}", email);
let env_dir = biovault_dir.join("env").join("default");
if !env_dir.exists() {
fs::create_dir_all(&env_dir)?;
info!("Created environment directory: {:?}", env_dir);
}
let template_nf_content = include_str!("../../templates/template.nf");
let template_nf_path = env_dir.join("template.nf");
fs::write(&template_nf_path, template_nf_content)?;
info!("Created template.nf at: {:?}", template_nf_path);
let nextflow_config_content = include_str!("../../templates/nextflow.config");
let nextflow_config_path = env_dir.join("nextflow.config");
fs::write(&nextflow_config_path, nextflow_config_content)?;
info!("Created nextflow.config at: {:?}", nextflow_config_path);
println!("✓ Nextflow templates installed to: {}", env_dir.display());
}
Ok(())
}