#[macro_use]
extern crate clap;
extern crate bigbed;
mod error;
use clap::{App, Arg, crate_version};
use crate::bigbed::BigBed;
use crate::bigbed::error::Error::*;
use std::fs::File;
use std::io::{self, BufReader, BufWriter, Write};
use std::process::exit;
fn main() {
let matches = App::new("rbb")
.about("Convert BigBed files to BED files")
.version(crate_version!())
.arg(
Arg::with_name("input.bb")
.help("BigBed file to convert")
.index(1)
.required(true)
)
.arg(
Arg::with_name("output.bed")
.help("Path for output BED file")
.index(2)
)
.arg(
Arg::with_name("chr")
.help("if set, restrict output to given chromosome")
.takes_value(true)
.long("chr")
)
.get_matches();
let output: BufWriter<Box<dyn Write>> = BufWriter::new(
match matches.value_of("output.bed") {
None => Box::new(io::stdout()),
Some(name) => {
match File::create(name) {
Err(err) => {
eprintln!("{}", err);
exit(1);
},
Ok(file) => {
Box::new(file)
}
}
}
}
);
let chrom = matches.value_of("chr");
let filename = matches.value_of("input.bb").unwrap();
match File::open(filename) {
Err(err) => {
eprintln!("{}", err);
eprintln!("Could not open file: {}", filename);
}
Ok(file) => {
let result = BigBed::from_file(BufReader::new(file));
match result {
Ok(mut bigbed) => {
eprintln!("{:#?}", bigbed);
let result = bigbed.write_bed(chrom, None, None, None, output);
if let Err(err) = result {
eprintln!("{}", err);
match err {
BadChrom(chr) | BadKey(chr, _) => {
eprintln!("This chromosome ('{}') may not be in the file.", chr);
}
_ => {}
}
}
}
Err(err) => {
match err {
IOError(_) => {
eprintln!("Could not open file '{}' due to the following error:\n{}.", filename, err);
}
BadSig{expected, received} => {
eprintln!("{}", err);
eprintln!("Is '{}' a BigBed file?", filename);
}
_ => {
eprintln!("{}", err)
}
}
}
}
}
}
}