From 5f4496ffce339898ce882cd439540618459d4cdf Mon Sep 17 00:00:00 2001 From: Alain Emilia Anna Zscheile Date: Fri, 6 Dec 2024 15:53:11 +0100 Subject: [PATCH] refactor(specctra-core/read): align read_optional to be like read_array_with_alias --- crates/specctra-core/src/mesadata.rs | 14 +++--- crates/specctra-core/src/read.rs | 65 ++++++++++++---------------- crates/specctra_derive/src/read.rs | 2 +- 3 files changed, 33 insertions(+), 48 deletions(-) diff --git a/crates/specctra-core/src/mesadata.rs b/crates/specctra-core/src/mesadata.rs index 2af29f4..f1ca1a2 100644 --- a/crates/specctra-core/src/mesadata.rs +++ b/crates/specctra-core/src/mesadata.rs @@ -190,15 +190,11 @@ impl AccessRules for SpecctraMesadata { } fn largest_clearance(&self, _maybe_net: Option) -> f64 { - let mut largest: f64 = 0.0; - - for rule in self.class_rules.values() { - if rule.clearance > largest { - largest = rule.clearance; - } - } - - largest + self.class_rules + .values() + .map(|rule| rule.clearance) + .reduce(f64::max) + .unwrap_or(0.0) } } diff --git a/crates/specctra-core/src/read.rs b/crates/specctra-core/src/read.rs index 4bd6cfa..8d4668d 100644 --- a/crates/specctra-core/src/read.rs +++ b/crates/specctra-core/src/read.rs @@ -46,13 +46,13 @@ impl ReadDsn for Parser { fn read_dsn(tokenizer: &mut ListTokenizer) -> Result { Ok(Self { string_quote: tokenizer - .read_optional("string_quote")? + .read_optional(&["string_quote"])? .inspect(|v| tokenizer.quote_char = Some(*v)), space_in_quoted_tokens: tokenizer - .read_optional("space_in_quoted_tokens")? + .read_optional(&["space_in_quoted_tokens"])? .inspect(|v| tokenizer.space_in_quoted = *v), - host_cad: tokenizer.read_optional("host_cad")?, - host_version: tokenizer.read_optional("host_version")?, + host_cad: tokenizer.read_optional(&["host_cad"])?, + host_version: tokenizer.read_optional(&["host_version"])?, }) } } @@ -332,25 +332,30 @@ impl ListTokenizer { pub fn read_optional>( &mut self, - name: &'static str, + valid_names: &[&'static str], ) -> Result, ParseErrorContext> { let input = self.consume_token()?; - if let ListToken::Start { - name: ref actual_name, - } = input.token - { - if actual_name == name { - let value = self.read_value::()?; - self.consume_token()?.expect_end()?; - Ok(Some(value)) + Ok( + if let ListToken::Start { + name: ref actual_name, + } = input.token + { + if valid_names + .iter() + .any(|i| i.eq_ignore_ascii_case(actual_name)) + { + let value = self.read_value::()?; + self.consume_token()?.expect_end()?; + Some(value) + } else { + self.return_token(input); + None + } } else { self.return_token(input); - Ok(None) - } - } else { - self.return_token(input); - Ok(None) - } + None + }, + ) } pub fn read_array>(&mut self) -> Result, ParseErrorContext> { @@ -379,25 +384,9 @@ impl ListTokenizer { &mut self, valid_names: &[&'static str], ) -> Result, ParseErrorContext> { - let mut array = Vec::::new(); - loop { - let input = self.consume_token()?; - if let ListToken::Start { - name: ref actual_name, - } = input.token - { - if valid_names.contains(&actual_name.to_ascii_lowercase().as_ref()) { - let value = self.read_value::()?; - self.consume_token()?.expect_end()?; - array.push(value); - } else { - self.return_token(input); - break; - } - } else { - self.return_token(input); - break; - } + let mut array = Vec::new(); + while let Some(value) = self.read_optional::(valid_names)? { + array.push(value); } Ok(array) } diff --git a/crates/specctra_derive/src/read.rs b/crates/specctra_derive/src/read.rs index 93e6975..19461d6 100644 --- a/crates/specctra_derive/src/read.rs +++ b/crates/specctra_derive/src/read.rs @@ -72,7 +72,7 @@ fn impl_field(field: &Field) -> TokenStream { if ident == "Option" { return quote! { #name: tokenizer - .read_optional(stringify!(#name_str))?, + .read_optional(&[stringify!(#name_str)])?, }; } }