use clap::{Args, Subcommand};
use color_eyre::eyre::eyre;
use convertor::config::ConvertorConfig;
use std::path::PathBuf;
#[derive(Default, Debug, Clone, Args)]
pub struct ConfigCmd {
#[arg()]
file: Option<PathBuf>,
#[command(subcommand)]
option: Option<ConfigCmdOption>,
}
#[derive(Default, Debug, Clone, Subcommand)]
pub enum ConfigCmdOption {
#[default]
Template,
#[command(name = "file")]
File,
}
pub struct ConfigCli {
pub cmd: ConfigCmd,
}
impl ConfigCli {
pub fn new(cmd: ConfigCmd) -> Self {
Self { cmd }
}
pub async fn execute(self) -> color_eyre::Result<ConvertorConfig> {
let config = match (self.cmd.file, self.cmd.option) {
(Some(file), _) => {
let config = ConvertorConfig::from_file(file)?;
println!("{config}");
config
}
(None, Some(ConfigCmdOption::Template)) => {
let config = ConvertorConfig::template();
println!("{config}");
config
}
(None, Some(ConfigCmdOption::File)) => {
let config = ConvertorConfig::search(std::env::current_dir()?, None::<&str>)?;
println!("{config}");
config
}
_ => return Err(eyre!("必须指定配置文件路径或者子命令")),
};
Ok(config)
}
}