noodles-sam 0.85.0

Sequence Alignment/Map (SAM) format reader and writer
Documentation
mod record;

use std::io::{self, Write};

use crate::Header;
use record::{write_comment, write_program, write_read_group, write_reference_sequence};

pub(super) fn write_header<W>(writer: &mut W, header: &Header) -> io::Result<()>
where
    W: Write,
{
    if let Some(header) = header.header() {
        record::write_header(writer, header)?;
    }

    for (name, reference_sequence) in header.reference_sequences() {
        write_reference_sequence(writer, name, reference_sequence)?;
    }

    for (id, read_group) in header.read_groups() {
        write_read_group(writer, id, read_group)?;
    }

    for (id, program) in header.programs().as_ref() {
        write_program(writer, id, program)?;
    }

    for comment in header.comments() {
        write_comment(writer, comment)?;
    }

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_write_header() -> io::Result<()> {
        use std::num::NonZero;

        use crate::header::record::value::{
            Map,
            map::{self, Program, ReadGroup, ReferenceSequence, header::Version},
        };

        let header = Header::builder()
            .set_header(Map::<map::Header>::new(Version::new(1, 6)))
            .add_reference_sequence(
                "sq0",
                Map::<ReferenceSequence>::new(const { NonZero::new(8).unwrap() }),
            )
            .add_reference_sequence(
                "sq1",
                Map::<ReferenceSequence>::new(const { NonZero::new(13).unwrap() }),
            )
            .add_read_group("rg0", Map::<ReadGroup>::default())
            .add_read_group("rg1", Map::<ReadGroup>::default())
            .add_program("pg0", Map::<Program>::default())
            .add_program("pg1", Map::<Program>::default())
            .add_comment("noodles")
            .add_comment("sam")
            .build();

        let mut buf = Vec::new();
        write_header(&mut buf, &header)?;

        let expected = b"@HD\tVN:1.6
@SQ\tSN:sq0\tLN:8
@SQ\tSN:sq1\tLN:13
@RG\tID:rg0
@RG\tID:rg1
@PG\tID:pg0
@PG\tID:pg1
@CO\tnoodles
@CO\tsam
";

        assert_eq!(buf, expected);

        Ok(())
    }
}