noodles_vcf/async/io/
writer.rs

1use tokio::io::{self, AsyncWrite, AsyncWriteExt};
2
3use crate::{variant::io::Write, Header, Record};
4
5/// An async VCF writer.
6///
7/// If the inner writer is buffered, a call to [`Self::shutdown`] must be made before the writer is
8/// dropped.
9pub struct Writer<W> {
10    inner: W,
11}
12
13impl<W> Writer<W>
14where
15    W: AsyncWrite + Unpin,
16{
17    /// Creates an async VCF writer.
18    ///
19    /// # Examples
20    ///
21    /// ```
22    /// use noodles_vcf as vcf;
23    /// let writer = vcf::r#async::io::Writer::new(Vec::new());
24    /// ```
25    pub fn new(inner: W) -> Self {
26        Self { inner }
27    }
28
29    /// Returns a reference to the underlying writer.
30    ///
31    /// # Examples
32    ///
33    /// ```
34    /// use noodles_vcf as vcf;
35    /// let writer = vcf::r#async::io::Writer::new(Vec::new());
36    /// assert!(writer.get_ref().is_empty());
37    /// ```
38    pub fn get_ref(&self) -> &W {
39        &self.inner
40    }
41
42    /// Returns a mutable reference to the underlying writer.
43    ///
44    /// # Examples
45    ///
46    /// ```
47    /// use noodles_vcf as vcf;
48    /// let mut writer = vcf::r#async::io::Writer::new(Vec::new());
49    /// assert!(writer.get_mut().is_empty());
50    /// ```
51    pub fn get_mut(&mut self) -> &mut W {
52        &mut self.inner
53    }
54
55    /// Returns the underlying writer.
56    ///
57    /// # Examples
58    ///
59    /// ```
60    /// use noodles_vcf as vcf;
61    /// let writer = vcf::r#async::io::Writer::new(Vec::new());
62    /// assert!(writer.into_inner().is_empty());
63    /// ```
64    pub fn into_inner(self) -> W {
65        self.inner
66    }
67
68    /// Shuts down the output stream.
69    ///
70    /// # Examples
71    ///
72    /// ```
73    /// # use std::io;
74    /// #
75    /// # #[tokio::main]
76    /// # async fn main() -> io::Result<()> {
77    /// use noodles_vcf as vcf;
78    /// let mut writer = vcf::r#async::io::Writer::new(Vec::new());
79    /// writer.shutdown().await?;
80    /// # Ok(())
81    /// # }
82    /// ```
83    pub async fn shutdown(&mut self) -> io::Result<()> {
84        self.inner.shutdown().await
85    }
86
87    /// Writes a VCF header.
88    ///
89    /// # Examples
90    ///
91    /// ```
92    /// # use std::io;
93    /// #
94    /// # #[tokio::main]
95    /// # async fn main() -> io::Result<()> {
96    /// use noodles_vcf as vcf;
97    ///
98    /// let mut writer = vcf::r#async::io::Writer::new(Vec::new());
99    ///
100    /// let header = vcf::Header::default();
101    /// writer.write_header(&header).await?;
102    /// # Ok(())
103    /// # }
104    /// ```
105    pub async fn write_header(&mut self, header: &Header) -> io::Result<()> {
106        let mut writer = crate::io::Writer::new(Vec::new());
107        writer.write_header(header)?;
108        self.inner.write_all(writer.get_ref()).await
109    }
110
111    /// Writes a VCF record.
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// # #[tokio::main]
117    /// # async fn main() -> tokio::io::Result<()> {
118    /// use noodles_core::Position;
119    /// use noodles_vcf as vcf;
120    ///
121    /// let mut writer = vcf::r#async::io::Writer::new(Vec::new());
122    ///
123    /// let header = vcf::Header::default();
124    /// let record = vcf::Record::default();
125    /// writer.write_record(&header, &record).await?;
126    /// # Ok(())
127    /// # }
128    /// ```
129    pub async fn write_record(&mut self, header: &Header, record: &Record) -> io::Result<()> {
130        let mut writer = crate::io::Writer::new(Vec::new());
131        writer.write_record(header, record)?;
132        self.inner.write_all(writer.get_ref()).await?;
133        Ok(())
134    }
135
136    /// Writes a variant record.
137    ///
138    /// # Examples
139    ///
140    /// ```
141    /// # #[tokio::main]
142    /// # async fn main() -> tokio::io::Result<()> {
143    /// use noodles_core::Position;
144    /// use noodles_vcf as vcf;
145    ///
146    /// let header = vcf::Header::default();
147    ///
148    /// let record = vcf::variant::RecordBuf::builder()
149    ///     .set_reference_sequence_name("sq0")
150    ///     .set_variant_start(Position::MIN)
151    ///     .set_reference_bases("A")
152    ///     .build();
153    ///
154    /// let mut writer = vcf::r#async::io::Writer::new(Vec::new());
155    /// writer.write_variant_record(&header, &record).await?;
156    /// # Ok(())
157    /// # }
158    /// ```
159    pub async fn write_variant_record(
160        &mut self,
161        header: &Header,
162        record: &dyn crate::variant::Record,
163    ) -> io::Result<()> {
164        let mut writer = crate::io::Writer::new(Vec::new());
165        writer.write_variant_record(header, record)?;
166        self.inner.write_all(writer.get_ref()).await?;
167        Ok(())
168    }
169}