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}