qubit_text_io/adapters/
utf8_text_writer.rs1use std::io::{
11 self,
12 Write,
13};
14
15use crate::{
16 LineEnding,
17 TextWrite,
18};
19
20#[derive(Debug)]
22pub struct Utf8TextWriter<W> {
23 inner: W,
24 line_ending: LineEnding,
25}
26
27impl<W> Utf8TextWriter<W>
28where
29 W: Write,
30{
31 #[must_use]
39 pub const fn new(inner: W) -> Self {
40 Self {
41 inner,
42 line_ending: LineEnding::Lf,
43 }
44 }
45
46 #[must_use]
54 pub const fn with_line_ending(mut self, line_ending: LineEnding) -> Self {
55 self.line_ending = line_ending;
56 self
57 }
58
59 #[must_use]
64 pub const fn get_ref(&self) -> &W {
65 &self.inner
66 }
67
68 pub fn get_mut(&mut self) -> &mut W {
73 &mut self.inner
74 }
75
76 #[must_use]
81 pub fn into_inner(self) -> W {
82 self.inner
83 }
84}
85
86impl<W> TextWrite for Utf8TextWriter<W>
87where
88 W: Write,
89{
90 type Error = io::Error;
91
92 #[inline]
93 fn line_ending(&self) -> LineEnding {
94 self.line_ending
95 }
96
97 #[inline]
98 fn write_char(&mut self, ch: char) -> Result<(), Self::Error> {
99 let mut buffer = [0_u8; 4];
100 self.write_str(ch.encode_utf8(&mut buffer))
101 }
102
103 fn write_chars(&mut self, chars: &[char]) -> Result<(), Self::Error> {
104 for ch in chars {
105 self.write_char(*ch)?;
106 }
107 Ok(())
108 }
109
110 #[inline]
111 fn write_str(&mut self, text: &str) -> Result<(), Self::Error> {
112 self.inner.write_all(text.as_bytes())
113 }
114
115 fn write_line(&mut self, line: &str) -> Result<(), Self::Error> {
116 self.write_str(line)?;
117 self.write_str(self.line_ending.as_str())
118 }
119
120 #[inline]
121 fn flush(&mut self) -> Result<(), Self::Error> {
122 self.inner.flush()
123 }
124}