use clap::{Parser, Subcommand};
use jump_start::{
commands,
config::{get_config_path, load_config},
};
use log::{LevelFilter, Log, Metadata, Record, debug, error, set_logger, set_max_level};
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
#[arg(short, long)]
verbose: bool,
}
#[derive(Subcommand)]
enum Commands {
#[command()]
Config {},
#[command(arg_required_else_help = true)]
Use {
starter_identifier: String,
dest: Option<String>,
},
#[command(arg_required_else_help = true)]
Find {
search_term: String,
#[arg(long)]
json: bool,
},
#[command(subcommand)]
Storybook(StorybookCommands),
#[command()]
UpdateReadme {},
}
#[derive(Subcommand)]
enum StorybookCommands {
Dev {
#[arg(short, long, default_value = "6006")]
port: u16,
},
Prod {
#[arg(short, long, default_value = "storybook-static")]
output: String,
},
}
fn main() {
let args = Cli::parse();
struct SimpleLogger;
impl Log for SimpleLogger {
fn enabled(&self, _metadata: &Metadata) -> bool {
true
}
fn log(&self, record: &Record) {
match record.level() {
log::Level::Debug | log::Level::Trace => println!("[DEBUG] {}", record.args()),
_ => println!("{}", record.args()),
}
}
fn flush(&self) {}
}
static LOGGER: SimpleLogger = SimpleLogger;
let max_level = if args.verbose {
LevelFilter::Debug
} else {
LevelFilter::Info
};
let _ = set_logger(&LOGGER);
set_max_level(max_level);
let config_path = get_config_path();
debug!("Using config path: {:?}", config_path);
let config = match load_config(&config_path) {
Ok(cfg) => cfg,
Err(err) => {
error!("Error reading config file: {}", err);
std::process::exit(1);
}
};
if config.instances.is_empty() || config.instances[0].name.is_empty() {
error!(
"Config file is missing instances. Add your instances to the file {:?}",
config_path
);
std::process::exit(1);
}
let result = match args.command {
Commands::Config {} => commands::config::config(config),
Commands::Use {
starter_identifier,
dest,
} => commands::r#use::r#use(config, &starter_identifier, dest.as_deref()),
Commands::Find { search_term, json } => commands::find::find(config, &search_term, json),
Commands::Storybook(storybook_command) => match storybook_command {
StorybookCommands::Dev { port } => commands::storybook::dev(config, port),
StorybookCommands::Prod { output } => commands::storybook::prod(config, output),
},
Commands::UpdateReadme {} => commands::update_readme::update_readme(config),
};
if let Err(err) = result {
error!("Error: {}", err);
std::process::exit(1);
}
}