noodles_fasta/async/io/
writer.rs

1//! Async FASTA writer.
2
3mod builder;
4mod record;
5
6use tokio::io::{self, AsyncWrite};
7
8pub use self::builder::Builder;
9use self::record::write_record;
10use crate::Record;
11
12/// An async 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 noodles_fasta as fasta;
25    /// use tokio::io;
26    /// let writer = fasta::r#async::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 noodles_fasta as fasta;
39    /// use tokio::io;
40    /// let mut writer = fasta::r#async::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 noodles_fasta as fasta;
53    /// use tokio::io;
54    /// let writer = fasta::r#async::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: AsyncWrite + Unpin,
65{
66    /// Creates a FASTA writer.
67    ///
68    /// # Examples
69    ///
70    /// ```
71    /// use noodles_fasta as fasta;
72    /// use tokio::io;
73    /// let writer = fasta::r#async::io::Writer::new(io::sink());
74    /// ```
75    pub fn new(inner: W) -> Self {
76        Builder::default().build_from_writer(inner)
77    }
78
79    /// Writes a FASTA record.
80    ///
81    /// By default, sequence lines are hard wrapped at 80 bases. This can be changed by using
82    /// [`Builder::set_line_base_count`] when creating the writer.
83    ///
84    /// # Examples
85    ///
86    /// ```
87    /// # #[tokio::main]
88    /// # async fn main() -> tokio::io::Result<()> {
89    /// use noodles_fasta::{self as fasta, record::{Definition, Sequence}};
90    /// use tokio::io;
91    ///
92    /// let mut writer = fasta::r#async::io::Writer::new(io::sink());
93    ///
94    /// let definition = Definition::new("sq0", None);
95    /// let sequence = Sequence::from(b"ACGT".to_vec());
96    /// let record = fasta::Record::new(definition, sequence);
97    ///
98    /// writer.write_record(&record).await?;
99    /// # Ok(())
100    /// # }
101    /// ```
102    pub async fn write_record(&mut self, record: &Record) -> io::Result<()> {
103        write_record(&mut self.inner, record, self.line_base_count).await
104    }
105}