From 3cdc5c5d3cd4d2907b21e097a91e3f50063281b5 Mon Sep 17 00:00:00 2001 From: Junichi Uekawa Date: Tue, 29 Mar 2022 15:32:09 +0900 Subject: [PATCH] argument: Add a key numeric parser. Sometimes I want numeric key in addition to value. BUG=b:215297064 TEST=cargo test Change-Id: I75ae37905d1a27709e2fa694ab01e0ac8ed8596c Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3556930 Reviewed-by: Daniel Verkamp Tested-by: kokoro Commit-Queue: Junichi Uekawa --- src/argument.rs | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/argument.rs b/src/argument.rs index e659391018..a825822dce 100644 --- a/src/argument.rs +++ b/src/argument.rs @@ -445,14 +445,30 @@ impl<'a> KeyValuePair<'a> { ))) } + fn get_numeric(&self, val: &str) -> Result + where + T: TryFrom, + >::Error: std::error::Error, + { + let num = parse_hex_or_decimal(val)?; + self.handle_parse_err(T::try_from(num)) + } + pub fn parse_numeric(&self) -> Result where T: TryFrom, >::Error: std::error::Error, { let val = self.value()?; - let num = parse_hex_or_decimal(val)?; - self.handle_parse_err(T::try_from(num)) + self.get_numeric(val) + } + + pub fn key_numeric(&self) -> Result + where + T: TryFrom, + >::Error: std::error::Error, + { + self.get_numeric(self.key()) } pub fn parse(&self) -> Result @@ -726,4 +742,19 @@ mod tests { assert!(parse_hex_or_decimal("0xz").is_err()); assert!(parse_hex_or_decimal("hello world").is_err()); } + + #[test] + fn parse_key_value_options_numeric_key() { + let mut opts = parse_key_value_options("test", "0x30,0x100=value,nonnumeric=value", ','); + let kv = opts.next().unwrap(); + assert_eq!(kv.key_numeric::().unwrap(), 0x30); + + let kv = opts.next().unwrap(); + assert_eq!(kv.key_numeric::().unwrap(), 0x100); + assert_eq!(kv.value().unwrap(), "value"); + + let kv = opts.next().unwrap(); + assert!(kv.key_numeric::().is_err()); + assert_eq!(kv.key(), "nonnumeric"); + } }