use crate::hdf5_io::*;
use crate::sparse_io::*;
use crate::zarr_io::{finalize_output, materialize_writable_backend, prepare_output};
use clap::Args;
use log::info;
#[derive(Args, Debug)]
pub struct ConvertArgs {
pub data_file: Box<str>,
#[arg(long, value_enum, default_value = "zarr")]
pub backend: SparseIoBackend,
#[arg(short, long)]
pub output: Box<str>,
#[arg(long = "no-zip", default_value_t = true, action = clap::ArgAction::SetFalse)]
pub zip: bool,
}
pub fn run_convert(args: &ConvertArgs) -> anyhow::Result<()> {
let (backend_in, file_in) = resolve_backend_file(&args.data_file, None)?;
let (effective_output, backend_out, file_out) =
prepare_output(&args.output, args.backend.clone(), args.zip)?;
if backend_in == backend_out {
info!(
"same backend ({:?}); staging {} -> {}",
backend_in, file_in, file_out
);
materialize_writable_backend(&file_in, &file_out)?;
} else {
info!(
"re-encoding {} ({:?}) -> {} ({:?})",
file_in, backend_in, file_out, backend_out
);
let data = open_sparse_matrix(&file_in, &backend_in)?;
let nrow = data
.num_rows()
.ok_or_else(|| anyhow::anyhow!("backend has no `nrow`"))?;
let ncol = data
.num_columns()
.ok_or_else(|| anyhow::anyhow!("backend has no `ncol`"))?;
let (_, _, triplets) = data.read_triplets_by_columns((0..ncol).collect())?;
let nnz = triplets.len();
let mut out = create_sparse_from_triplets_owned(
triplets,
(nrow, ncol, nnz),
Some(file_out.as_ref()),
Some(&backend_out),
)?;
out.register_row_names_vec(&data.row_names()?);
out.register_column_names_vec(&data.column_names()?);
drop(out);
info!("re-encoded {} non-zeros in {} x {}", nnz, nrow, ncol);
}
let final_path = finalize_output(&file_out, &effective_output)?;
info!("done: {}", final_path);
Ok(())
}