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}