chainfile 0.4.0

A crate for working with genomics chain files.
Documentation
use std::env;
use std::fs::File;
use std::io::BufReader;

use chain::liftover;
use chainfile as chain;
use flate2::read::GzDecoder;
use omics::coordinate::interval::interbase::Interval;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let interval = env::args().nth(1).expect("missing interval");
    let src = env::args().nth(2).expect("missing src");

    let interval = interval.parse::<Interval>()?;

    let reader = File::open(src)
        .map(GzDecoder::new)
        .map(BufReader::new)
        .map(chain::Reader::new)?;

    let machine = liftover::machine::builder::Builder.try_build_from(reader)?;
    let results = machine.liftover(interval);

    match results {
        Some(chains) => {
            for chain_liftover in chains {
                println!(
                    "chain {} (score {})",
                    chain_liftover.chain().id(),
                    chain_liftover.chain().score()
                );
                for segment in chain_liftover.segments() {
                    println!("  {segment}");
                }
            }
        }
        None => println!("Does not exist in new genome"),
    }

    Ok(())
}