noodles_fasta/io/
writer.rs

1//! FASTA writer.
2
3pub(crate) mod builder;
4mod record;
5
6use std::io::{self, Write};
7
8pub use self::builder::Builder;
9use self::record::write_record;
10use crate::Record;
11
12/// A FASTA writer.
13pub struct Writer<W> {
14    inner: W,
15    line_base_count: usize,
16}
17
18impl<W> Writer<W> {
19    /// Returns a reference to the underlying writer.
20    ///
21    /// # Examples
22    ///
23    /// ```
24    /// # use std::io;
25    /// use noodles_fasta as fasta;
26    /// let writer = fasta::io::Writer::new(io::sink());
27    /// let _inner = writer.get_ref();
28    /// ```
29    pub fn get_ref(&self) -> &W {
30        &self.inner
31    }
32
33    /// Returns a mutable reference to the underlying writer.
34    ///
35    /// # Examples
36    ///
37    /// ```
38    /// # use std::io;
39    /// use noodles_fasta as fasta;
40    /// let mut writer = fasta::io::Writer::new(io::sink());
41    /// let _inner = writer.get_mut();
42    /// ```
43    pub fn get_mut(&mut self) -> &mut W {
44        &mut self.inner
45    }
46
47    /// Unwraps and returns the underlying writer.
48    ///
49    /// # Examples
50    ///
51    /// ```
52    /// # use std::io;
53    /// use noodles_fasta as fasta;
54    /// let writer = fasta::io::Writer::new(io::sink());
55    /// let _inner = writer.into_inner();
56    /// ```
57    pub fn into_inner(self) -> W {
58        self.inner
59    }
60}
61
62impl<W> Writer<W>
63where
64    W: Write,
65{
66    /// Creates a FASTA writer.
67    ///
68    /// # Examples
69    ///
70    /// ```
71    /// use noodles_fasta as fasta;
72    /// let writer = fasta::io::Writer::new(Vec::new());
73    /// ```
74    pub fn new(inner: W) -> Self {
75        Builder::default().build_from_writer(inner)
76    }
77
78    /// Writes a FASTA record.
79    ///
80    /// By default, sequence lines are hard wrapped at 80 bases. This can be changed by using
81    /// [`Builder::set_line_base_count`] when creating the writer.
82    ///
83    /// # Examples
84    ///
85    /// ```
86    /// # use std::io;
87    /// use noodles_fasta::{self as fasta, record::{Definition, Sequence}};
88    ///
89    /// let mut writer = fasta::io::Writer::new(Vec::new());
90    ///
91    /// let definition = Definition::new("sq0", None);
92    /// let sequence = Sequence::from(b"ACGT".to_vec());
93    /// let record = fasta::Record::new(definition, sequence);
94    ///
95    /// writer.write_record(&record)?;
96    ///
97    /// assert_eq!(writer.get_ref(), b">sq0\nACGT\n");
98    /// # Ok::<(), io::Error>(())
99    /// ```
100    pub fn write_record(&mut self, record: &Record) -> io::Result<()> {
101        write_record(&mut self.inner, record, self.line_base_count)
102    }
103}
104
105#[cfg(test)]
106mod tests {
107    use super::*;
108
109    #[test]
110    fn test_new() {
111        let writer = Writer::new(Vec::new());
112        assert_eq!(writer.line_base_count, 80);
113    }
114}