use crate::driver::{ArchiveFileInfo, FileDriver}; use crate::ArchiveResult; use std::error::Error; use std::io::{Read, Write}; pub trait Driver: Sized { type Error: Error; type Io; type FileInfo: ArchiveFileInfo; } pub trait ArchiveRead: Driver where Self::Io: Read, { type FileReader<'d>: FileDriver where Self: 'd; // Create driver instance fn read(io: Self::Io) -> ArchiveResult; // Return vec of file infos fn files(&self) -> &Vec; // Return file index by name fn get_file_index(&self, name: &str) -> ArchiveResult; // Return file info by index fn get_file_info(&self, index: usize) -> ArchiveResult<&Self::FileInfo, Self::Error>; // Return file reader by index fn get_file_reader<'d>( &'d mut self, index: usize, password: Option<&str>, ) -> ArchiveResult, Self::Error>; } pub trait ArchiveWrite: Driver where Self::Io: Read + Write, { type FileWriter<'d>: FileDriver where Self: 'd; }