rsbx 2.0.0

Enhanced implementation of SeqBox in Rust
Documentation
#![allow(dead_code)]
use file_writer::FileWriter;
use std::io::SeekFrom;
use general_error::Error;
use std::io::Write;
use std::fs::Metadata;
use stdout_error::{StdoutError,
                   to_err};

pub enum WriterType {
    File(FileWriter),
    Stdout(std::io::Stdout),
}

pub struct Writer {
    writer : WriterType,
}

impl Writer {
    pub fn new(writer : WriterType) -> Writer {
        Writer {
            writer
        }
    }

    pub fn write(&mut self, buf : &[u8]) -> Result<usize, Error> {
        match self.writer {
            WriterType::File(ref mut f)   => f.write(buf),
            WriterType::Stdout(ref mut s) => match s.write(buf) {
                Ok(len) => Ok(len),
                Err(e)  => Err(to_err(StdoutError::new(e.kind()))),
            }
        }
    }

    pub fn read(&mut self, buf : &mut [u8]) -> Option<Result<usize, Error>> {
        match self.writer {
            WriterType::File(ref mut f) => Some(f.read(buf)),
            WriterType::Stdout(_)       => None,
        }
    }

    pub fn set_len(&mut self, size : u64) -> Option<Result<(), Error>> {
        match self.writer {
            WriterType::File(ref mut f) => Some(f.set_len(size)),
            WriterType::Stdout(_)       => None,
        }
    }

    pub fn seek(&mut self, pos : SeekFrom) -> Option<Result<u64, Error>> {
        match self.writer {
            WriterType::File(ref mut f) => Some(f.seek(pos)),
            WriterType::Stdout(_)       => None,
        }
    }

    pub fn cur_pos(&mut self) -> Option<Result<u64, Error>> {
        match self.writer {
            WriterType::File(ref mut f) => Some(f.cur_pos()),
            WriterType::Stdout(_)       => None,
        }
    }

    pub fn metadata(&self) -> Option<Result<Metadata, Error>> {
        match self.writer {
            WriterType::File(ref f) => Some(f.metadata()),
            WriterType::Stdout(_)    => None,
        }
    }

    pub fn get_file_size(&mut self) -> Option<Result<u64, Error>> {
        match self.writer {
            WriterType::File(ref mut f) => Some(f.get_file_size()),
            WriterType::Stdout(_)       => None,
        }
    }
}