use crate::config::default_config_path;
use anyhow::{Context, bail};
use std::env;
use std::fs;
use std::path::Path;
pub struct Init {}
impl Init {
pub fn create(config_path: Option<&Path>) -> anyhow::Result<()> {
let path = match config_path {
Some(p) => {
if p.is_relative() {
env::current_dir()?.join(p)
} else {
p.to_path_buf()
}
}
None => default_config_path()?,
};
if path.exists() {
bail!("Configuration file {} already exists", path.display());
}
let confstr = match env::consts::OS {
"illumos" => include_str!("../config/illumos.lua"),
"linux" => include_str!("../config/linux.lua"),
"macos" => include_str!("../config/macos.lua"),
"netbsd" => include_str!("../config/netbsd.lua"),
"solaris" => include_str!("../config/illumos.lua"),
os => {
eprintln!(
"WARNING: OS '{}' not explicitly supported, using generic config",
os
);
include_str!("../config/generic.lua")
}
};
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)
.with_context(|| format!("Failed to create {}", parent.display()))?;
}
fs::write(&path, confstr)?;
println!("Created {}", path.display());
Ok(())
}
}