blkar 7.2.7

Multithreaded archiver offering bit rot protection and sector level recoverability
Documentation
#![allow(dead_code)]
use crate::file_writer::FileWriter;
use crate::general_error::Error;
use crate::reader::ReadResult;
use crate::stdout_error::{to_err, StdoutError};
use std::fs::Metadata;
use std::io::SeekFrom;
use std::io::Write;

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<ReadResult, 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,
        }
    }
}