mod bam_record_ext;
mod binning;
mod cli;
mod config;
mod pbar;
mod pipelines;
mod range;
mod reader;
mod record;
mod writer;
use std::path::Path;
use anyhow::Result;
use clap::Parser;
use config::default_worker_count;
use pipelines::PipelineConfig;
use crate::range::Range;
fn main() -> Result<()> {
let args = cli::CliArgs::parse();
if !Path::new(&args.bam_file).exists() {
eprintln!("错误: 找不到文件 '{}'", args.bam_file);
std::process::exit(1);
}
println!("处理 BAM: {}", args.bam_file);
let worker_count = if args.workers > 0 {
args.workers
} else {
default_worker_count()
};
let pipeline_cfg = PipelineConfig::new(worker_count);
let out_dir: String = Path::new(&args.bam_file)
.parent()
.map(|d| d.to_str().unwrap_or(""))
.unwrap_or(".")
.to_string();
let bam_name = Path::new(&args.bam_file)
.file_stem()
.unwrap()
.to_str()
.unwrap()
.to_string();
match args.commands {
cli::Commands::RawBam(raw_bam_args) => {
pipelines::raw_bam_pipeline::run_pipeline(
&args.bam_file,
&pipeline_cfg,
raw_bam_args.slice_n,
&out_dir,
&bam_name,
);
}
cli::Commands::AlignedBam(aligned_bam_args) => {
let range = Range::<usize>::new(&aligned_bam_args.ref_range);
pipelines::aligned_bam_pipeline::run_pipeline(
&args.bam_file,
&pipeline_cfg,
&range,
&out_dir,
&bam_name,
);
}
}
Ok(())
}