X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Foptions.rs;h=d065892dddd4d81f233935ba25e36d38875df6c4;hb=b6b2edf658c6399daa8f6a6b782d9ede5c3dd68c;hp=c2f2d4d0ab2971502a0014cc744962e489001b78;hpb=8a7d01e22bc077744806be21f81898377d0726b3;p=nihav.git diff --git a/nihav-core/src/options.rs b/nihav-core/src/options.rs index c2f2d4d..d065892 100644 --- a/nihav-core/src/options.rs +++ b/nihav-core/src/options.rs @@ -8,6 +8,24 @@ use std::sync::Arc; use std::fmt; +pub use crate::compr::deflate::{DEFLATE_MODE_DESCRIPTION, DEFLATE_OPTION_VALUES, DEFLATE_MODE_NONE, DEFLATE_MODE_FAST, DEFLATE_MODE_BETTER, DEFLATE_MODE_BEST}; + +/// Common name for keyframe interval option. +pub const KEYFRAME_OPTION: &str = "key_int"; +/// Common description for keyframe interval option. +pub const KEYFRAME_OPTION_DESC: &str = "Keyframe interval (0 - automatic)"; + +/// Common name for frame skipping mode. +pub const FRAME_SKIP_OPTION: &str = "frame_skip"; +/// Common description for frame skipping mode. +pub const FRAME_SKIP_OPTION_DESC: &str = "Frame skipping mode"; +/// Frame skipping option value for no skipped frames. +pub const FRAME_SKIP_OPTION_VAL_NONE: &str = "none"; +/// Frame skipping option value for decoding only keyframes. +pub const FRAME_SKIP_OPTION_VAL_KEYFRAME: &str = "keyframes"; +/// Frame skipping option value for decoding only intra frames. +pub const FRAME_SKIP_OPTION_VAL_INTRA: &str = "intra"; + /// A list specifying option parsing and validating errors. #[derive(Clone,Copy,Debug,PartialEq)] pub enum OptionError { @@ -54,25 +72,25 @@ pub struct NAOptionDefinition { impl NAOptionDefinition { /// Tries to parse input string(s) as an option and returns new option and number of arguments used (1 or 2) on success. - pub fn parse(&self, name: &String, value: Option<&String>) -> OptionResult<(NAOption, usize)> { + pub fn parse(&self, name: &str, value: Option<&String>) -> OptionResult<(NAOption, usize)> { let no_name = "no".to_owned() + self.name; let opt_no_name = "--no".to_owned() + self.name; - if name == &no_name || name == &opt_no_name { + if name == no_name || name == opt_no_name { match self.opt_type { NAOptionDefinitionType::Bool => return Ok((NAOption { name: self.name, value: NAValue::Bool(false) }, 1)), _ => return Err(OptionError::InvalidFormat), }; } let opt_name = "--".to_owned() + self.name; - if self.name != name && &opt_name != name { + if self.name != name && opt_name != name { return Err(OptionError::WrongName); } match self.opt_type { NAOptionDefinitionType::None => Ok((NAOption { name: self.name, value: NAValue::None }, 1)), NAOptionDefinitionType::Bool => Ok((NAOption { name: self.name, value: NAValue::Bool(true) }, 1)), NAOptionDefinitionType::Int(_, _) => { - if let Some(str) = value { - let ret = str.parse::(); + if let Some(strval) = value { + let ret = strval.parse::(); if let Ok(val) = ret { let opt = NAOption { name: self.name, value: NAValue::Int(val) }; self.check(&opt)?; @@ -85,8 +103,8 @@ impl NAOptionDefinition { } }, NAOptionDefinitionType::Float(_, _) => { - if let Some(str) = value { - let ret = str.parse::(); + if let Some(strval) = value { + let ret = strval.parse::(); if let Ok(val) = ret { let opt = NAOption { name: self.name, value: NAValue::Float(val) }; self.check(&opt)?; @@ -99,8 +117,8 @@ impl NAOptionDefinition { } }, NAOptionDefinitionType::String(_) => { - if let Some(str) = value { - let opt = NAOption { name: self.name, value: NAValue::String(str.to_string()) }; + if let Some(strval) = value { + let opt = NAOption { name: self.name, value: NAValue::String(strval.to_string()) }; self.check(&opt)?; Ok((opt, 2)) } else { @@ -165,9 +183,9 @@ impl NAOptionDefinition { Ok(()) }, NAValue::String(ref cur_str) => { - if let NAOptionDefinitionType::String(Some(ref strings)) = self.opt_type { - for str in strings.iter() { - if cur_str == str { + if let NAOptionDefinitionType::String(Some(strings)) = self.opt_type { + for string in strings.iter() { + if cur_str == string { return Ok(()); } } @@ -187,7 +205,7 @@ impl fmt::Display for NAOptionDefinition { NAOptionDefinitionType::None => write!(f, "{}: {}", self.name, self.description), NAOptionDefinitionType::Bool => write!(f, "[no]{}: {}", self.name, self.description), NAOptionDefinitionType::String(ref str_list) => { - if let Some(ref opts) = str_list { + if let Some(opts) = str_list { write!(f, "{} {}: {}", self.name, opts.join("|"), self.description) } else { write!(f, "{} : {}", self.name, self.description) @@ -277,17 +295,17 @@ mod test { #[test] fn test_option_parsing() { let mut def = NAOptionDefinition { name: "option", description: "", opt_type: NAOptionDefinitionType::Float(None, None) }; - assert_eq!(def.parse(&"--option".to_string(), None), Err(OptionError::ParseError)); - assert_eq!(def.parse(&"--nooption".to_string(), None), Err(OptionError::InvalidFormat)); - assert_eq!(def.parse(&"--option".to_string(), Some(&"42".to_string())), + assert_eq!(def.parse("--option", None), Err(OptionError::ParseError)); + assert_eq!(def.parse("--nooption", None), Err(OptionError::InvalidFormat)); + assert_eq!(def.parse("--option", Some(&"42".to_string())), Ok((NAOption{name:"option",value: NAValue::Float(42.0)}, 2))); def.opt_type = NAOptionDefinitionType::Float(None, Some(40.0)); - assert_eq!(def.parse(&"--option".to_string(), Some(&"42".to_string())), + assert_eq!(def.parse("--option", Some(&"42".to_string())), Err(OptionError::InvalidValue)); let def = NAOptionDefinition { name: "option", description: "", opt_type: NAOptionDefinitionType::Bool }; - assert_eq!(def.parse(&"option".to_string(), None), + assert_eq!(def.parse("option", None), Ok((NAOption{name: "option", value: NAValue::Bool(true) }, 1))); - assert_eq!(def.parse(&"nooption".to_string(), None), + assert_eq!(def.parse("nooption", None), Ok((NAOption{name: "option", value: NAValue::Bool(false) }, 1))); } }