1use eyre::{eyre, Result};
2use inquire::Confirm;
3use lux_lib::config::{Config, ConfigBuilder};
4
5#[derive(clap::Subcommand)]
6pub enum ConfigCmd {
7 Init(Init),
9 Edit,
11 Show,
14}
15
16#[derive(clap::Args)]
17pub struct Init {
18 #[arg(long, conflicts_with = "current")]
21 default: bool,
22
23 #[arg(long, conflicts_with = "default")]
26 current: bool,
27}
28
29pub fn config(cmd: ConfigCmd, config: Config) -> Result<()> {
30 match cmd {
31 ConfigCmd::Init(init) => {
32 let config_file = ConfigBuilder::config_file()?;
33 if !config_file.is_file()
34 || Confirm::new("Config already exists. Overwrite?")
35 .with_default(false)
36 .prompt()
37 .expect("Error prompting to overwrite config")
38 {
39 std::fs::create_dir_all(config_file.parent().unwrap())?;
40 let content = if init.default {
41 let cfg: ConfigBuilder = ConfigBuilder::default().build()?.into();
42 toml::to_string(&cfg)?
43 } else if init.current {
44 let cfg: ConfigBuilder = config.into();
45 toml::to_string(&cfg)?
46 } else {
47 String::default()
48 };
49 std::fs::write(&config_file, content)?;
50 print!("Config initialised at {}", config_file.display());
51 }
52 }
53 ConfigCmd::Edit => {
54 let config_file = ConfigBuilder::config_file()?;
55 if !config_file.is_file() {
56 return Err(eyre!(
57 "
58No config file found.
59Use 'lux config init', 'lux config init --default', or 'lux config init --current'
60to initialise a config file.
61"
62 ));
63 }
64 edit::edit_file(config_file)?;
65 }
66 ConfigCmd::Show => {
67 let cfg: ConfigBuilder = config.into();
68 print!("{}", toml::to_string(&cfg)?);
69 }
70 }
71 Ok(())
72}