noodles_tabix/io/writer.rs
1mod index;
2
3use std::io::{self, Write};
4
5use noodles_bgzf as bgzf;
6
7use self::index::write_index;
8use crate::Index;
9
10/// A tabix writer.
11pub struct Writer<W>
12where
13 W: Write,
14{
15 inner: bgzf::Writer<W>,
16}
17
18impl<W> Writer<W>
19where
20 W: Write,
21{
22 /// Creates a tabix writer.
23 ///
24 /// # Examples
25 ///
26 /// ```
27 /// use noodles_tabix as tabix;
28 /// let writer = tabix::io::Writer::new(Vec::new());
29 /// ```
30 pub fn new(writer: W) -> Self {
31 Self {
32 inner: bgzf::Writer::new(writer),
33 }
34 }
35
36 /// Returns a reference to the underlying writer.
37 ///
38 /// # Examples
39 ///
40 /// ```
41 /// # use std::io;
42 /// use noodles_tabix as tabix;
43 /// let writer = tabix::io::Writer::new(io::sink());
44 /// let _inner = writer.get_ref();
45 /// ```
46 pub fn get_ref(&self) -> &bgzf::Writer<W> {
47 &self.inner
48 }
49
50 /// Returns a mutable reference to the underlying writer.
51 ///
52 /// # Examples
53 ///
54 /// ```
55 /// # use std::io;
56 /// use noodles_tabix as tabix;
57 /// let mut writer = tabix::io::Writer::new(io::sink());
58 /// let _inner = writer.get_mut();
59 /// ```
60 pub fn get_mut(&mut self) -> &mut bgzf::Writer<W> {
61 &mut self.inner
62 }
63
64 /// Returns the underlying writer.
65 ///
66 /// # Examples
67 ///
68 /// ```
69 /// # use std::io;
70 /// use noodles_tabix as tabix;
71 /// let writer = tabix::io::Writer::new(io::sink());
72 /// let _inner = writer.into_inner();
73 /// ```
74 pub fn into_inner(self) -> bgzf::Writer<W> {
75 self.inner
76 }
77
78 /// Attempts to finish the output stream.
79 ///
80 /// This is typically only manually called if the underlying stream is needed before the writer
81 /// is dropped.
82 ///
83 /// # Examples
84 ///
85 /// ```
86 /// # use std::io;
87 /// use noodles_tabix as tabix;
88 /// let mut writer = tabix::io::Writer::new(Vec::new());
89 /// writer.try_finish()?;
90 /// # Ok::<(), io::Error>(())
91 /// ```
92 pub fn try_finish(&mut self) -> io::Result<()> {
93 self.inner.try_finish()
94 }
95
96 /// Writes a tabix index.
97 ///
98 /// # Examples
99 ///
100 /// ```
101 /// use noodles_csi::binning_index::index::Header;
102 /// use noodles_tabix as tabix;
103 ///
104 /// let mut writer = tabix::io::Writer::new(Vec::new());
105 /// let index = tabix::Index::builder().set_header(Header::default()).build();
106 /// writer.write_index(&index)?;
107 /// # Ok::<(), std::io::Error>(())
108 /// ```
109 pub fn write_index(&mut self, index: &Index) -> io::Result<()> {
110 write_index(&mut self.inner, index)
111 }
112}