broadcast/
lib.rs

1use std::io::{Result, Write};
2
3/// A type which duplicates its writes to all provided writers
4pub struct BroadcastWriter<A: Write, B: Write> {
5    primary: A,
6    secondary: B,
7}
8
9impl<A: Write, B: Write> BroadcastWriter<A, B> {
10    /// Creates a new broadcast instance which can be used as a Write
11    /// All data will be written to the primary writer as well as the seconardary
12    /// writer. Errors that occur during the either write operartion will be yielded.
13    pub fn new(primary: A, secondary: B) -> BroadcastWriter<A, B> {
14        BroadcastWriter {
15            primary: primary,
16            secondary: secondary,
17        }
18    }
19}
20
21impl<A: Write, B: Write> Write for BroadcastWriter<A, B> {
22    fn write(&mut self, data: &[u8]) -> Result<usize> {
23        let n = try!(self.primary.write(data));
24        try!(self.secondary.write_all(&data[..n]));
25        Ok(n)
26    }
27
28    fn flush(&mut self) -> Result<()> {
29        self.primary.flush().and(self.secondary.flush())
30    }
31}
32
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use std::io::Write;
38    #[test]
39    fn broadcast() {
40        let mut first = Vec::new();
41        let mut second = Vec::new();
42        {
43            let mut broadcaster = BroadcastWriter::new(&mut first, &mut second);
44            let _ = broadcaster.write(b"it's over 9000!");
45        }
46        assert_eq!(first, second);
47    }
48}