use crate::handlers::merging::same_file;
use crate::sparse_io::SparseIoBackend;
use crate::zarr_io::{output_target, prepare_output};
use clap::Args;
mod convert;
mod group_table;
mod split;
mod subsample;
mod subset;
pub use convert::*;
pub use split::*;
pub use subsample::*;
pub use subset::*;
#[derive(Args, Debug)]
pub struct ReorderRowsArgs {
pub data_file: Box<str>,
#[arg(short, long, required = true)]
pub row_file: Box<str>,
#[arg(short, long, required = true)]
pub output: Box<str>,
#[arg(long = "no-zip", default_value_t = true, action = clap::ArgAction::SetFalse)]
pub zip: bool,
}
#[derive(Args, Debug)]
pub struct SubsetArgs {
pub data_file: Box<str>,
#[arg(short, long, required = true)]
pub output: Box<str>,
#[arg(long, default_value_t = false)]
pub batch_process: bool,
#[command(flatten)]
pub session: legume_tui::cli::SessionArgs,
}
#[derive(Args, Debug)]
pub struct SubsetColumnsArgs {
pub data_file: Box<str>,
#[arg(short = 'i', long, conflicts_with_all = ["name_file", "pattern"])]
pub column_indices: Option<Box<str>>,
#[arg(short = 'f', long, conflicts_with = "pattern")]
pub name_file: Option<Box<str>>,
#[arg(long)]
pub pattern: Option<Box<str>>,
#[arg(long, default_value_t = false)]
pub batch_process: bool,
#[command(flatten)]
pub session: legume_tui::cli::SessionArgs,
#[arg(short = 'd', long, default_value = "@")]
pub delimiter: char,
#[arg(
long,
action = clap::ArgAction::Set,
num_args = 0..=1,
require_equals = true,
default_missing_value = "true",
default_value_t = true
)]
pub allow_prefix: bool,
#[arg(long, default_value_t = false)]
pub exact_names: bool,
#[arg(long, default_value_t = false)]
pub do_squeeze: bool,
#[arg(long, default_value_t = 1)]
pub row_nnz_cutoff: usize,
#[arg(long, default_value_t = 1)]
pub column_nnz_cutoff: usize,
#[arg(short, long, required = true)]
pub output: Box<str>,
#[arg(long = "no-zip", default_value_t = true, action = clap::ArgAction::SetFalse)]
pub zip: bool,
}
#[derive(Args, Debug)]
pub struct SubsetRowsArgs {
pub data_file: Box<str>,
#[arg(short = 'i', long, conflicts_with_all = ["name_file", "pattern"])]
pub row_indices: Option<Box<str>>,
#[arg(short = 'f', long, conflicts_with = "pattern")]
pub name_file: Option<Box<str>>,
#[arg(long)]
pub pattern: Option<Box<str>>,
#[arg(long, default_value_t = false)]
pub batch_process: bool,
#[command(flatten)]
pub session: legume_tui::cli::SessionArgs,
#[arg(short = 'd', long, default_value = "@")]
pub delimiter: char,
#[arg(
long,
action = clap::ArgAction::Set,
num_args = 0..=1,
require_equals = true,
default_missing_value = "true",
default_value_t = true
)]
pub allow_prefix: bool,
#[arg(long, default_value_t = false)]
pub exact_names: bool,
#[arg(long, default_value_t = false)]
pub do_squeeze: bool,
#[arg(long, default_value_t = 1)]
pub row_nnz_cutoff: usize,
#[arg(long, default_value_t = 1)]
pub column_nnz_cutoff: usize,
#[arg(short, long, required = true)]
pub output: Box<str>,
#[arg(long = "no-zip", default_value_t = true, action = clap::ArgAction::SetFalse)]
pub zip: bool,
}
pub(crate) fn ensure_output_is_no_input<S: AsRef<str>>(
inputs: &[S],
output: &str,
backend: SparseIoBackend,
zip: bool,
) -> anyhow::Result<()> {
let target = output_target(output, backend, zip)?;
for input in inputs {
let input = input.as_ref();
for p in [&target.effective, &target.working, &target.found] {
anyhow::ensure!(
!same_file(input, p),
"the output {p} is the input {input}: give -o another name"
);
}
}
Ok(())
}
pub(crate) fn prepare_output_beside(
input: &str,
output: &str,
backend: SparseIoBackend,
zip: bool,
) -> anyhow::Result<(Box<str>, SparseIoBackend, Box<str>)> {
ensure_output_is_no_input(&[input], output, backend.clone(), zip)?;
prepare_output(output, backend, zip)
}
pub use crate::qc::squeeze_in_place;
#[cfg(test)]
mod tests;