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}