use std::ffi::OsString;
use concord::{App, Result};
#[derive(Debug, PartialEq, Eq)]
enum CliCommand {
Run,
Version,
CheckConfig,
}
#[tokio::main]
async fn main() -> Result<()> {
install_rustls_crypto_provider();
match cli_command_from_args(std::env::args_os().skip(1)) {
CliCommand::Run => {}
CliCommand::Version => {
println!("concord {}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
CliCommand::CheckConfig => {
check_config()?;
return Ok(());
}
}
let app = App::new();
app.run().await
}
fn cli_command_from_args(args: impl IntoIterator<Item = OsString>) -> CliCommand {
match args
.into_iter()
.next()
.and_then(|arg| arg.into_string().ok())
{
Some(arg) if arg == "--version" => CliCommand::Version,
Some(arg) if arg == "--check-config" => CliCommand::CheckConfig,
_ => CliCommand::Run,
}
}
fn check_config() -> Result<()> {
let (_options, app_warnings) = concord::config::load_options_with_warnings()?;
let (keymap, keymap_warnings) = concord::config::load_keymap_options_with_warnings()?;
concord::tui::validate_keymap_options(&keymap)?;
let (theme, theme_parser_warnings) = concord::config::load_theme_options_with_warnings()?;
for warning in app_warnings
.into_iter()
.chain(keymap_warnings)
.chain(theme_parser_warnings)
.chain(concord::tui::theme_options_warnings(&theme))
{
println!("warning: {warning}");
}
println!("concord config OK");
Ok(())
}
fn install_rustls_crypto_provider() {
let _ = rustls::crypto::ring::default_provider().install_default();
}
#[cfg(test)]
mod tests {
use super::{CliCommand, cli_command_from_args};
#[test]
fn cli_command_maps_arguments_to_commands() {
for (args, expected) in [
(vec!["--version".into()], CliCommand::Version),
(vec!["--check-config".into()], CliCommand::CheckConfig),
(vec![], CliCommand::Run),
(vec!["--unknown".into()], CliCommand::Run),
] {
assert_eq!(cli_command_from_args(args.clone()), expected, "{args:?}");
}
}
}