1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use crate::output::WriteResult;

/// Represents an output stream of data to an arbitrary destination.
pub trait OutputStream {

    /// Writes the entire buffer to the stream.
    fn write(&mut self, buffer: &[u8]) -> WriteResult {
        let mut rem: &[u8] = buffer;
        let mut count: usize = 0;
        while rem.len() != 0 {
            match self.some(rem) {
                WriteResult::Written(c) => {
                    count += c;
                    rem = &rem[c..];
                },
                WriteResult::Timeout(c) =>
                    return WriteResult::Timeout(count + c),
                WriteResult::Failure(c, e) =>
                    return WriteResult::Failure(count + c, e),
            }
        }
        WriteResult::Written(count)
    }

    /// Writes some data from the buffer to the stream.
    fn some(&mut self, buffer: &[u8]) -> WriteResult;
}