use bgzip::write::BGZFWriter; use clap::Parser; use std::fs::File; use std::io::prelude::*; #[cfg(not(feature = "rayon"))] #[derive(Debug, Clone, Parser, PartialEq)] struct Cli { #[command()] input_file: String, #[arg(short, long)] output: String, #[arg(short, long)] compress_level: u32, } #[cfg(feature = "rayon")] #[derive(Debug, Clone, Parser, PartialEq)] struct Cli { #[command()] input_file: String, #[arg(short, long)] output: String, #[arg(short, long)] compress_level: u32, #[arg(short = '@', long)] thread: Option, } fn main() -> anyhow::Result<()> { let cli = Cli::parse(); let mut file_reader = File::open(&cli.input_file)?; let file_writer = File::create(&cli.output)?; let level = bgzip::Compression::new(cli.compress_level)?; #[cfg(feature = "rayon")] let mut writer: Box = if let Some(thread) = cli.thread { rayon::ThreadPoolBuilder::new() .num_threads(thread) .build_global()?; Box::new(bgzip::write::BGZFMultiThreadWriter::new(file_writer, level)) } else { Box::new(BGZFWriter::new(file_writer, level)) }; #[cfg(not(feature = "rayon"))] let mut writer = BGZFWriter::new(file_writer, level)?; std::io::copy(&mut file_reader, &mut writer)?; Ok(()) }