pub mod autocomplete;
pub mod clean;
pub mod cluster;
pub mod directories;
pub mod init;
pub mod jobs;
pub mod launchers;
pub mod scan;
pub mod status;
pub mod submit;
use clap::{Args, Parser, Subcommand, ValueEnum};
use clap_complete::ArgValueCandidates;
use clap_verbosity_flag::{Verbosity, WarnLevel};
use log::trace;
use std::io;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None, subcommand_required = true)]
pub struct Options {
#[command(subcommand)]
pub command: Option<Commands>,
#[command(flatten)]
pub global: GlobalOptions,
#[command(flatten)]
pub verbose: Verbosity<WarnLevel>,
}
#[derive(Args, Debug, Clone)]
pub struct GlobalOptions {
#[arg(long, default_value_t=8 as u16, global=true, env="ROW_IO_THREADS", display_order=2)]
pub io_threads: u16,
#[arg(long, value_name="WHEN", value_enum, default_value_t=ColorMode::Auto, global=true, env="ROW_COLOR", display_order=2)]
pub color: ColorMode,
#[arg(long, global = true, env = "ROW_NO_PROGRESS", display_order = 2)]
pub no_progress: bool,
#[arg(long, global = true, env = "ROW_CLEAR_PROGRESS", display_order = 2)]
pub clear_progress: bool,
#[arg(long, global = true, env = "ROW_CLUSTER", display_order = 2,
add=ArgValueCandidates::new(autocomplete::get_cluster_candidates))]
cluster: Option<String>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
pub enum ColorMode {
Auto,
Always,
Never,
}
#[derive(Subcommand, Debug)]
pub enum ShowCommands {
Status(status::Arguments),
Directories(directories::Arguments),
Cluster(cluster::Arguments),
Launchers(launchers::Arguments),
Jobs(jobs::Arguments),
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Init(init::Arguments),
#[command(subcommand)]
Show(ShowCommands),
Scan(scan::Arguments),
Submit(submit::Arguments),
Clean(clean::Arguments),
}
pub fn parse_directories<F>(
mut query_directories: Vec<PathBuf>,
get_all_directories: F,
) -> Result<Vec<PathBuf>, row::Error>
where
F: FnOnce() -> Result<Vec<PathBuf>, row::Error>,
{
if query_directories.len() == 1 && query_directories[0] == PathBuf::from("-") {
trace!("Reading directories from stdin.");
query_directories.clear();
for line in io::stdin().lines() {
query_directories.push(PathBuf::from(line?));
}
} else if query_directories.is_empty() {
trace!("Checking all directories.");
query_directories = get_all_directories()?;
}
Ok(query_directories)
}