use anyhow::Result; use std::io; use lazy_static::lazy_static; extern crate enum_map; use enum_map::enum_map; use enum_map::{Enum, EnumMap}; pub mod program; pub mod digest; use crate::meta_plugin::program::MetaPluginProgram; use crate::meta_plugin::digest::DigestSha256MetaPlugin; use strum::IntoEnumIterator; #[derive(Debug, Eq, PartialEq, Clone, strum::EnumIter, strum::Display, strum::EnumString, Enum)] #[strum(ascii_case_insensitive)] pub enum MetaPluginType { FileMagic, DigestSha256, DigestMd5, ReadTime, ReadRate, } pub trait MetaPlugin { fn is_supported(&self) -> bool { true } fn create(&self) -> Result>; fn finalize(&mut self) -> io::Result; // Update the meta plugin with new data fn update(&mut self, data: &[u8]); fn meta_name(&mut self) -> String; } use std::io::Write; lazy_static! { pub static ref META_PLUGIN_PROGRAMS: EnumMap> = enum_map! { MetaPluginType::FileMagic => { let program = MetaPluginProgram::new("file", vec!["-bE", "-"], "file_magic".to_string(), true); if program.supported { Some(program) } else { None } } MetaPluginType::DigestSha256 => { let program = MetaPluginProgram::new("sha256sum", vec![], "digest_sha256".to_string(), true); if program.supported { Some(program) } else { None } } MetaPluginType::DigestMd5 => { let program = MetaPluginProgram::new("md5sum", vec![], "digest_md5".to_string(), true); if program.supported { Some(program) } else { None } } }; } pub fn get_meta_plugin(meta_plugin_type: MetaPluginType) -> Box { match meta_plugin_type { MetaPluginType::FileMagic => Box::new(MetaPluginProgram::new("file", vec!["-bE", "-"], "file_magic".to_string(), true)), MetaPluginType::DigestSha256 => Box::new(DigestSha256MetaPlugin::new()), MetaPluginType::DigestMd5 => Box::new(MetaPluginProgram::new("md5sum", vec![], "digest_md5".to_string(), true)), MetaPluginType::ReadTime => Box::new(ReadTimeMetaPlugin::new()), MetaPluginType::ReadRate => Box::new(ReadRateMetaPlugin::new()), } } pub fn default_meta_plugin_type() -> MetaPluginType { let mut default = MetaPluginType::FileMagic; for meta_plugin_type in MetaPluginType::iter() { let meta_plugin = get_meta_plugin(meta_plugin_type.clone()); if meta_plugin.is_supported() { default = meta_plugin_type; break; } } default }