diff --git a/noodles-vcf/CHANGELOG.md b/noodles-vcf/CHANGELOG.md index d6b5e5b07..315ab737e 100644 --- a/noodles-vcf/CHANGELOG.md +++ b/noodles-vcf/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Added + + * vcf/writer: Add builder (`vcf::writer::Builder`). + ### Fixed * vcf/record/genotypes/keys/key: Hash inner key. diff --git a/noodles-vcf/src/lib.rs b/noodles-vcf/src/lib.rs index 31a415212..0fc0980c0 100644 --- a/noodles-vcf/src/lib.rs +++ b/noodles-vcf/src/lib.rs @@ -29,7 +29,7 @@ pub mod reader; pub mod record; mod variant_reader; mod variant_writer; -mod writer; +pub mod writer; pub use self::{ header::Header, indexed_reader::IndexedReader, reader::Reader, record::Record, diff --git a/noodles-vcf/src/writer.rs b/noodles-vcf/src/writer.rs index 689a08f3f..8b07c244c 100644 --- a/noodles-vcf/src/writer.rs +++ b/noodles-vcf/src/writer.rs @@ -1,7 +1,11 @@ +//! VCF writer. + +mod builder; mod record; use std::io::{self, Write}; +pub use self::builder::Builder; use self::record::write_record; use super::{Header, Record, VariantWriter}; diff --git a/noodles-vcf/src/writer/builder.rs b/noodles-vcf/src/writer/builder.rs new file mode 100644 index 000000000..48c7f520a --- /dev/null +++ b/noodles-vcf/src/writer/builder.rs @@ -0,0 +1,40 @@ +use std::{ + fs::File, + io::{self, BufWriter, Write}, + path::Path, +}; + +use noodles_bgzf as bgzf; + +use super::Writer; + +/// A BAM writer builder. +#[derive(Debug, Default)] +pub struct Builder; + +impl Builder { + /// Builds a VCF writer from a path. + /// + /// # Examples + /// + /// ```no_run + /// use noodles_vcf as vcf; + /// let writer = vcf::writer::Builder.build_from_path("out.vcf")?; + /// # Ok::<_, std::io::Error>(()) + /// ``` + pub fn build_from_path

(self, dst: P) -> io::Result>> + where + P: AsRef, + { + let dst = dst.as_ref(); + + let file = File::create(dst)?; + + let writer: Box = match dst.extension().and_then(|ext| ext.to_str()) { + Some("gz" | "bgz") => Box::new(bgzf::Writer::new(file)), + _ => Box::new(BufWriter::new(file)), + }; + + Ok(Writer::new(writer)) + } +}