file_endec 1.0.1

Secure file encryption and decryption from the command line.
Documentation
use crate::files::file_meta::FileInfo;
use crate::files::reading::open_reader;
use crate::header::{get_version_strategy, parse_header, Header, Strategy};
use crate::{FedResult, Verbosity};

#[derive(Debug)]
pub struct FileHeader<'a> {
    pub file: &'a FileInfo<'a>,
    pub header: Header,
    pub strategy: &'a Strategy,
}

impl<'a> FileHeader<'a> {
    pub fn new(file: &'a FileInfo<'a>, header: Header, verbosity: Verbosity) -> FedResult<Self> {
        let strategy = get_version_strategy(header.version(), verbosity.debug())?;
        Ok(FileHeader {
            file,
            header,
            strategy,
        })
    }
}

pub fn read_file_strategies<'a>(
    files: &'a [FileInfo],
    verbosity: Verbosity,
) -> FedResult<Vec<FileHeader<'a>>> {
    files
        .iter()
        .map(|fi| (fi, open_reader(&fi, verbosity)))
        .map(|(fi, reader)| {
            (
                fi,
                reader.and_then(|mut r| parse_header(&mut r, verbosity.debug())),
            )
        })
        .map(|(fi, header)| header.and_then(|h| FileHeader::new(fi, h, verbosity)))
        .collect()
}

pub trait FileStrategy {
    fn file(&self) -> &FileInfo;
    fn strategy(&self) -> &Strategy;
}

impl<'a> FileStrategy for FileHeader<'a> {
    fn file(&self) -> &FileInfo {
        self.file
    }

    fn strategy(&self) -> &Strategy {
        self.strategy
    }
}