use std::process;
use clap::{Arg, Command};
use rustynetics::bigwig::BigWigFile;
fn query(filename_in: &str, chrom: &str, from: usize, to: usize, bin_size: usize, verbose: bool) {
if verbose {
eprintln!("Opening bigWig file {}", filename_in);
}
let mut reader = BigWigFile::new_reader(filename_in).unwrap_or_else(|err| {
eprintln!("Error opening file: {}", err);
process::exit(1);
});
for result in reader.query(chrom, from, to, bin_size) {
match result {
Ok(record) => {
println!(
"{}:[{}, {})={}",
record.data.chrom, record.data.from, record.data.to, record.data.statistics
);
}
Err(err) => {
eprintln!("Error querying BigWig file: {}", err);
process::exit(1);
}
}
}
}
fn main() {
let matches = Command::new("BigWig Query")
.version("1.0")
.author("Philipp Benner [https://github.com/pbenner]")
.about("Query BigWig files")
.arg(
Arg::new("input")
.help("The input BigWig file")
.required(true)
.index(1),
)
.arg(
Arg::new("chrom")
.help("The chromosome to query")
.required(true)
.index(2),
)
.arg(
Arg::new("from")
.help("The start position")
.required(true)
.index(3),
)
.arg(
Arg::new("to")
.help("The end position")
.required(true)
.index(4),
)
.arg(
Arg::new("binsize")
.help("The bin size for the query")
.required(true)
.index(5),
)
.arg(
Arg::new("verbose")
.short('v')
.long("verbose")
.action(clap::ArgAction::SetTrue)
.help("Be verbose"),
)
.get_matches();
let filename_in = matches
.get_one::<String>("input")
.expect("Input file is required");
let chrom = matches
.get_one::<String>("chrom")
.expect("Chromosome is required");
let from: usize = matches
.get_one::<String>("from")
.expect("Start position is required")
.parse()
.unwrap_or_else(|_| {
eprintln!("Invalid start position");
process::exit(1);
});
let to: usize = matches
.get_one::<String>("to")
.expect("End position is required")
.parse()
.unwrap_or_else(|_| {
eprintln!("Invalid end position");
process::exit(1);
});
let bin_size: usize = matches
.get_one::<String>("binsize")
.expect("Bin size is required")
.parse()
.unwrap_or_else(|_| {
eprintln!("Invalid bin size");
process::exit(1);
});
let verbose = matches.get_flag("verbose");
query(filename_in, chrom, from, to, bin_size, verbose);
}