nafcodec 0.3.1

Rust coder/decoder for Nucleotide Archive Format (NAF) files.
Documentation
extern crate nafcodec;

use std::borrow::Cow;
use std::io::Cursor;

use nafcodec::Decoder;
use nafcodec::EncoderBuilder;
use nafcodec::Flag;
use nafcodec::Record;
use nafcodec::SequenceType::Dna;

fn test_records() -> Vec<Record<'static>> {
    vec![
        Record {
            id: Some(Cow::from("r1")),
            comment: Some(Cow::from("record 1")),
            sequence: Some(Cow::from("NGCTCTTAAACCTGCTA")),
            quality: Some(Cow::from("#8CCCGGGGGGGGGGGG")),
            length: Some(17),
        },
        Record {
            id: Some(Cow::from("r2")),
            comment: Some(Cow::from("record 2")),
            sequence: Some(Cow::from("NTAATAAGCAATGACGGCAGC")),
            quality: Some(Cow::from("#8AACCFF<FFGGFGE@@@@@")),
            length: Some(21),
        },
    ]
}

#[test]
pub fn encode_id() {
    let mut encoder = EncoderBuilder::from_flags(Dna, Flag::Id)
        .with_memory()
        .unwrap();

    let records = test_records();
    encoder.push(&records[0]).unwrap();
    encoder.push(&records[1]).unwrap();

    let mut buffer = Vec::new();
    encoder.write(&mut buffer).unwrap();

    let mut decoder = Decoder::new(Cursor::new(buffer)).unwrap();
    assert!(decoder.header().flags().test(Flag::Id));
    assert!(!decoder.header().flags().test(Flag::Comment));
    assert!(!decoder.header().flags().test(Flag::Sequence));
    assert!(!decoder.header().flags().test(Flag::Quality));

    let r1 = decoder.next().unwrap().unwrap();
    assert_eq!(r1.id, Some(Cow::from("r1")));
    assert!(r1.comment.is_none());
    assert!(r1.sequence.is_none());
    assert!(r1.quality.is_none());
    assert!(r1.length.is_none());

    let r2 = decoder.next().unwrap().unwrap();
    assert_eq!(r2.id, Some(Cow::from("r2")));
    assert!(r2.comment.is_none());
    assert!(r2.sequence.is_none());
    assert!(r2.quality.is_none());
    assert!(r2.length.is_none());
}

#[test]
pub fn encode_id_sequence() {
    let mut encoder = EncoderBuilder::from_flags(Dna, Flag::Id | Flag::Sequence)
        .with_memory()
        .unwrap();

    let records = test_records();
    encoder.push(&records[0]).unwrap();
    encoder.push(&records[1]).unwrap();

    let mut buffer = Vec::new();
    encoder.write(&mut buffer).unwrap();

    let mut decoder = Decoder::new(Cursor::new(buffer)).unwrap();
    assert!(decoder.header().flags().test(Flag::Id));
    assert!(!decoder.header().flags().test(Flag::Comment));
    assert!(decoder.header().flags().test(Flag::Sequence));
    assert!(!decoder.header().flags().test(Flag::Quality));

    let r1 = decoder.next().unwrap().unwrap();

    assert_eq!(r1.id, Some(Cow::from("r1")));
    assert!(r1.comment.is_none());
    assert_eq!(r1.sequence, Some(Cow::from("NGCTCTTAAACCTGCTA")));
    assert!(r1.quality.is_none());
    assert!(r1.length.is_some());

    let r2 = decoder.next().unwrap().unwrap();
    assert_eq!(r2.id, Some(Cow::from("r2")));
    assert!(r2.comment.is_none());
    assert_eq!(r2.sequence, Some(Cow::from("NTAATAAGCAATGACGGCAGC")));
    assert!(r2.quality.is_none());
    assert!(r2.length.is_some());
}

#[test]
pub fn encode_quality() {
    let mut encoder = EncoderBuilder::new(Dna)
        .quality(true)
        .sequence(false)
        .id(false)
        .with_memory()
        .unwrap();

    let records = test_records();
    encoder.push(&records[0]).unwrap();
    encoder.push(&records[1]).unwrap();

    let mut buffer = Vec::new();
    encoder.write(&mut buffer).unwrap();

    let mut decoder = Decoder::new(Cursor::new(buffer)).unwrap();
    println!("{:?}", decoder.header());
    assert!(!decoder.header().flags().test(Flag::Id));
    assert!(!decoder.header().flags().test(Flag::Comment));
    assert!(!decoder.header().flags().test(Flag::Sequence));
    assert!(decoder.header().flags().test(Flag::Quality));

    let r1 = decoder.next().unwrap().unwrap();
    assert!(r1.id.is_none());
    assert!(r1.comment.is_none());
    assert!(r1.sequence.is_none());
    assert_eq!(r1.quality, Some(Cow::from("#8CCCGGGGGGGGGGGG")));
    assert!(r1.length.is_some());

    let r2 = decoder.next().unwrap().unwrap();
    assert!(r2.id.is_none());
    assert!(r2.comment.is_none());
    assert!(r2.sequence.is_none());
    assert_eq!(r2.quality, Some(Cow::from("#8AACCFF<FFGGFGE@@@@@")));
    assert!(r2.length.is_some());
}

#[test]
pub fn encode_all() {
    let mut encoder = EncoderBuilder::new(Dna)
        .quality(true)
        .sequence(true)
        .id(true)
        .comment(true)
        .with_memory()
        .unwrap();

    let records = test_records();
    encoder.push(&records[0]).unwrap();
    encoder.push(&records[1]).unwrap();

    let mut buffer = Vec::new();
    encoder.write(&mut buffer).unwrap();

    let mut decoder = Decoder::new(Cursor::new(buffer)).unwrap();
    println!("{:?}", decoder.header());
    assert!(decoder.header().flags().test(Flag::Id));
    assert!(decoder.header().flags().test(Flag::Comment));
    assert!(decoder.header().flags().test(Flag::Sequence));
    assert!(decoder.header().flags().test(Flag::Quality));

    let r1 = decoder.next().unwrap().unwrap();
    assert_eq!(r1.id, Some(Cow::from("r1")));
    assert_eq!(r1.comment, Some(Cow::from("record 1")));
    assert_eq!(r1.sequence, Some(Cow::from("NGCTCTTAAACCTGCTA")));
    assert_eq!(r1.quality, Some(Cow::from("#8CCCGGGGGGGGGGGG")));
    assert!(r1.length.is_some());

    let r2 = decoder.next().unwrap().unwrap();
    assert_eq!(r2.id, Some(Cow::from("r2")));
    assert_eq!(r2.comment, Some(Cow::from("record 2")));
    assert_eq!(r2.sequence, Some(Cow::from("NTAATAAGCAATGACGGCAGC")));
    assert_eq!(r2.quality, Some(Cow::from("#8AACCFF<FFGGFGE@@@@@")));
    assert!(r2.length.is_some());
}