//! The module defines decoder plugin data structures use crate::convert::FromIter; use crate::error::Error; /// Decoder plugin #[derive(Clone, Debug, PartialEq, RustcEncodable)] pub struct Plugin { /// name pub name: String, /// supported file suffixes (extensions) pub suffixes: Vec, /// supported MIME-types pub mime_types: Vec, } impl FromIter for Vec { fn from_iter>>(iter: I) -> Result { let mut result = Vec::new(); let mut plugin: Option = None; for reply in iter { let (a, b) = reply?; match &*a { "plugin" => { plugin.map(|p| result.push(p)); plugin = Some(Plugin { name: b, suffixes: Vec::new(), mime_types: Vec::new(), }); } "mime_type" => { plugin.as_mut().map(|p| p.mime_types.push(b)); } "suffix" => { plugin.as_mut().map(|p| p.suffixes.push(b)); } _ => unreachable!(), } } plugin.map(|p| result.push(p)); Ok(result) } }