From 0427abcee289d47968391253ea1c51c36d57e64f Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 15 May 2020 13:44:53 -0400 Subject: [PATCH] netdoc: teach MaybeItem about parse_args_as_str(). This simplifies a couple of places in routerdesc parsing. --- tor-netdoc/src/routerdesc.rs | 16 +++------------- tor-netdoc/src/tokenize.rs | 10 ++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tor-netdoc/src/routerdesc.rs b/tor-netdoc/src/routerdesc.rs index 23fa34854..ab67b3ce7 100644 --- a/tor-netdoc/src/routerdesc.rs +++ b/tor-netdoc/src/routerdesc.rs @@ -75,7 +75,7 @@ pub struct RouterDesc { is_extrainfo_cache: bool, // TODO: these families can get bulky. Perhaps we should de-duplicate // them in a cache, like Tor does. - family: RelayFamily, + family: Option, platform: Option, // TODO: these polices can get bulky too. Perhaps we should // de-duplicate them too. @@ -497,13 +497,7 @@ impl RouterDesc { } // Family - let family = { - if let Some(fam_tok) = body.get(FAMILY) { - fam_tok.args_as_str().parse::()? - } else { - RelayFamily(Vec::new()) - } - }; + let family = body.maybe(FAMILY).parse_args_as_str::()?; // or-address // Extract at most one ipv6 address from the list. It's not great, @@ -518,11 +512,7 @@ impl RouterDesc { } // platform - let platform = if let Some(p_tok) = body.get(PLATFORM) { - Some(p_tok.args_as_str().parse::()?) - } else { - None - }; + let platform = body.maybe(PLATFORM).parse_args_as_str::()?; // ipv4_policy let ipv4_policy = { diff --git a/tor-netdoc/src/tokenize.rs b/tor-netdoc/src/tokenize.rs index 0400fbbc6..67ea0a0f3 100644 --- a/tor-netdoc/src/tokenize.rs +++ b/tor-netdoc/src/tokenize.rs @@ -411,6 +411,16 @@ impl<'a, 'b> MaybeItem<'a, 'b> { self.0.map(|item| item.args_as_str()) } #[allow(dead_code)] + pub fn parse_args_as_str(&self) -> Result> + where + V: FromStr, + { + match self.0 { + Some(item) => Ok(Some(item.args_as_str().parse::()?)), + None => Ok(None), + } + } + #[allow(dead_code)] pub fn get_obj(&self, want_tag: &str) -> Result>> { match self.0 { Some(item) => Ok(Some(item.get_obj(want_tag)?)),