cluExtIO/write/union/
write.rs1
2use crate::write::ext_write::ExtWrite;
3
4use std::fmt::Debug;
5use std::io::Write;
6use std::io;
7use std::fmt;
8
9pub struct UnionWrite<W: Write, W2: Write>(W, W2);
10
11impl<W: Write, W2: Write> UnionWrite<W, W2> {
12 #[inline]
13 pub fn new(out: W, out2: W2) -> Self {
14 UnionWrite(out, out2)
15 }
16}
17impl<W: Write, W2: Write> Debug for UnionWrite<W, W2> {
27 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28 f.pad("UnionWrite { .. }")
29 }
30}
31
32impl<W: Write, W2: Write> Write for UnionWrite<W, W2> {
33 #[inline(always)]
34 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
35 let e = self.0.write(buf);
36 let e2 = self.1.write(buf);
37
38 match e {
39 Ok(ref size_0) => {
40 match e2 {
41 Ok(ref size_2) if size_0 >= size_2 => return Ok(*size_0),
42 Ok(ref size_2) if size_0 < size_2 => return Ok(*size_2),
43 err => return err,
44 }
45 },
46 err => return err,
47 }
48 }
49 #[inline(always)]
50 fn flush(&mut self) -> io::Result<()> {
51 let e = self.0.flush();
52 let e2 = self.1.flush();
53
54 if let Err(_) = e {
55 return e;
56 }
57 e2
58 }
59
60 #[inline(always)]
61 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
62 let e = self.0.write_all(buf);
63 let e2 = self.1.write_all(buf);
64
65 if let Err(_) = e {
66 return e;
67 }
68 e2
69 }
70
71 #[inline(always)]
72 fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
73 let e = self.0.write_fmt(fmt);
74 let e2 = self.1.write_fmt(fmt);
75
76 if let Err(_) = e {
77 return e;
78 }
79 e2
80 }
81}
82
83impl<W: Write + Clone, W2: Write + Clone> Clone for UnionWrite<W, W2> {
84 fn clone(&self) -> Self {
85 Self::new(self.0.clone(), self.1.clone())
86 }
87}
88
89impl<'a, W: ExtWrite<'a>, W2: ExtWrite<'a>> ExtWrite<'a> for UnionWrite<W, W2> {
90 type LockWrite = UnionWrite<W::LockWrite, W2::LockWrite>;
91
92 fn lock(&'a self) -> Self::LockWrite {
93 Self::LockWrite::new(self.0.lock(), self.1.lock())
94 }
95}
96
97impl<'a, W: 'static + 'a + ExtWrite<'a>, W2: 'static + 'a + ExtWrite<'a>> Into<Box<Write + 'a>> for UnionWrite<W, W2> {
98 fn into(self) -> Box<Write> {
99 Box::new(self)
100 }
101}
102