use std::{
env,
io::{self, BufWriter},
};
use noodles_fasta as fasta;
use noodles_sam::{self as sam, alignment::io::Write};
use noodles_util::alignment;
const UNMAPPED: &str = "*";
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut args = env::args().skip(1);
let src = args.next().expect("missing src");
let raw_region = args.next().expect("missing region");
let fasta_src = args.next();
let mut builder = alignment::io::indexed_reader::Builder::default();
if let Some(fasta_src) = fasta_src {
let repository = fasta::io::indexed_reader::Builder::default()
.build_from_path(fasta_src)
.map(fasta::repository::adapters::IndexedReader::new)
.map(fasta::Repository::new)?;
builder = builder.set_reference_sequence_repository(repository);
}
let mut reader = builder.build_from_path(src)?;
let header = reader.read_header()?;
let query: Box<dyn Iterator<Item = io::Result<Box<dyn sam::alignment::Record>>>> =
if raw_region == UNMAPPED {
reader.query_unmapped(&header).map(Box::new)?
} else {
let region = raw_region.parse()?;
reader.query(&header, ®ion).map(Box::new)?
};
let stdout = io::stdout().lock();
let mut writer = sam::io::Writer::new(BufWriter::new(stdout));
for result in query {
let record = result?;
writer.write_alignment_record(&header, &record)?;
}
Ok(())
}