noodles_bcf/io/reader/
builder.rs

1use std::{
2    fs::File,
3    io::{self, Read},
4    path::Path,
5};
6
7use noodles_bgzf as bgzf;
8
9use super::Reader;
10use crate::io::CompressionMethod;
11
12/// A BCF reader builder.
13#[derive(Default)]
14pub struct Builder {
15    compression_method: Option<CompressionMethod>,
16}
17
18impl Builder {
19    /// Sets the compression method.
20    ///
21    /// # Examples
22    ///
23    /// ```
24    /// use noodles_bcf::io::{reader::Builder, CompressionMethod};
25    /// let builder = Builder::default().set_compression_method(CompressionMethod::Bgzf);
26    /// ```
27    pub fn set_compression_method(mut self, compression_method: CompressionMethod) -> Self {
28        self.compression_method = Some(compression_method);
29        self
30    }
31
32    /// Builds a BCF reader from a path.
33    ///
34    /// # Examples
35    ///
36    /// ```no_run
37    /// use noodles_bcf::io::reader::Builder;
38    /// let reader = Builder::default().build_from_path("sample.bcf")?;
39    /// # Ok::<_, std::io::Error>(())
40    /// ````
41    pub fn build_from_path<P>(self, src: P) -> io::Result<Reader<Box<dyn Read>>>
42    where
43        P: AsRef<Path>,
44    {
45        let file = File::open(src)?;
46        self.build_from_reader(file)
47    }
48
49    /// Builds a BCF reader from a reader.
50    ///
51    /// # Examples
52    ///
53    /// ```
54    /// # use std::io;
55    /// use noodles_bcf::io::reader::Builder;
56    /// let reader = Builder::default().build_from_reader(io::empty());
57    /// ```
58    pub fn build_from_reader<'r, R>(self, reader: R) -> io::Result<Reader<Box<dyn Read + 'r>>>
59    where
60        R: Read + 'r,
61    {
62        let inner: Box<dyn Read> = match self.compression_method {
63            Some(CompressionMethod::Bgzf) | None => Box::new(bgzf::Reader::new(reader)),
64            Some(CompressionMethod::None) => Box::new(reader),
65        };
66
67        Ok(Reader::from(inner))
68    }
69}