noodles_vcf/io/reader/
builder.rs1use std::{
2 fs::File,
3 io::{self, BufRead, BufReader, Read},
4 path::Path,
5};
6
7use noodles_bgzf as bgzf;
8
9use super::Reader;
10use crate::io::CompressionMethod;
11
12#[derive(Debug, Default)]
14pub struct Builder {
15 compression_method: Option<CompressionMethod>,
16}
17
18impl Builder {
19 pub fn set_compression_method(mut self, compression_method: CompressionMethod) -> Self {
28 self.compression_method = Some(compression_method);
29 self
30 }
31
32 pub fn build_from_path<P>(mut self, src: P) -> io::Result<Reader<Box<dyn BufRead>>>
45 where
46 P: AsRef<Path>,
47 {
48 let src = src.as_ref();
49
50 if self.compression_method.is_none() {
51 self.compression_method = match src.extension().and_then(|ext| ext.to_str()) {
52 Some("gz" | "bgz") => Some(CompressionMethod::Bgzf),
53 _ => Some(CompressionMethod::None),
54 };
55 }
56
57 let reader = File::open(src)?;
58 self.build_from_reader(reader)
59 }
60
61 pub fn build_from_reader<'r, R>(self, reader: R) -> io::Result<Reader<Box<dyn BufRead + 'r>>>
72 where
73 R: Read + 'r,
74 {
75 let inner: Box<dyn BufRead> = match self.compression_method {
76 Some(CompressionMethod::Bgzf) => Box::new(bgzf::Reader::new(reader)),
77 Some(CompressionMethod::None) | None => Box::new(BufReader::new(reader)),
78 };
79
80 Ok(Reader::new(inner))
81 }
82}