diff --git a/Cargo.lock b/Cargo.lock index a07fcda..ef11f0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,32 +43,32 @@ checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bstr" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530" dependencies = [ "memchr", "regex-automata", - "serde", + "serde_core", ] [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "cast" @@ -78,9 +78,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.62" +version = "1.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" dependencies = [ "find-msvc-tools", "shlex", @@ -94,9 +94,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -144,18 +144,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ "anstyle", "clap_lex", @@ -220,9 +220,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -230,18 +230,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -265,9 +265,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "find-msvc-tools" @@ -371,13 +371,12 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.98" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -389,7 +388,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libhaystack" -version = "3.2.0" +version = "3.2.2" dependencies = [ "chrono", "chrono-tz", @@ -416,15 +415,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "num-traits" @@ -551,9 +550,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -566,9 +565,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core", @@ -624,9 +623,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -636,9 +635,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -647,15 +646,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "same-file" @@ -704,9 +703,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -717,9 +716,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "siphasher" @@ -735,15 +734,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -796,18 +795,18 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -818,9 +817,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -828,9 +827,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -841,18 +840,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.98" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -975,18 +974,18 @@ checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" dependencies = [ "proc-macro2", "quote", @@ -995,6 +994,6 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 417d548..1fd0e3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libhaystack" -version = "3.2.0" +version = "3.2.2" description = "Rust implementation of the Haystack 4 data types, defs, filter, units, and encodings" authors = ["J2 Innovations", "Radu Racariu "] edition = "2024" diff --git a/src/haystack/defs/namespace.rs b/src/haystack/defs/namespace.rs index c4aaa5c..46954d2 100644 --- a/src/haystack/defs/namespace.rs +++ b/src/haystack/defs/namespace.rs @@ -96,7 +96,7 @@ impl Namespace { let mut ns = Namespace { defs: defs .into_iter() - .filter_map(|rec| rec.get_symbol("def").map(|def| (def.clone(), rec.clone()))) + .filter_map(|rec| rec.get_symbol("def").cloned().map(|def| (def, rec))) .collect(), ..Default::default() diff --git a/src/haystack/encoding/zinc/decode/lexer.rs b/src/haystack/encoding/zinc/decode/lexer.rs index e67fecf..1d9e7d6 100644 --- a/src/haystack/encoding/zinc/decode/lexer.rs +++ b/src/haystack/encoding/zinc/decode/lexer.rs @@ -194,7 +194,7 @@ impl<'a, R: Read> Lexer> { Some(TokenValue::Value(value)) => Ok(value.clone()), _ => self.scanner.make_generic_err(&format!( "Expected Value token, found token {cur:?}", - cur = &self.cur.value + cur = self.cur.value )), } } @@ -204,7 +204,7 @@ impl<'a, R: Read> Lexer> { Some(TokenValue::Id(value)) => Ok(value.clone()), _ => self.scanner.make_generic_err(&format!( "Expected Id token, found token {cur:?}", - cur = &self.cur.value + cur = self.cur.value )), } } @@ -236,7 +236,7 @@ impl<'a, R: Read> Lexer> { _ => self.scanner.make_generic_err(&format!( "{msg}. Expected char token {expect:?}, found token {cur:?}", expect = char as char, - cur = &self.cur.value + cur = self.cur.value )), } } diff --git a/src/haystack/encoding/zinc/encode.rs b/src/haystack/encoding/zinc/encode.rs index 4758a44..0ce9e64 100644 --- a/src/haystack/encoding/zinc/encode.rs +++ b/src/haystack/encoding/zinc/encode.rs @@ -177,8 +177,8 @@ impl ToZinc for DateTime { } else { writer.write_fmt(format_args!( "{} {}", - &self.to_rfc3339_opts(SecondsFormat::AutoSi, true), - &self.timezone_short_name() + self.to_rfc3339_opts(SecondsFormat::AutoSi, true), + self.timezone_short_name() ))? } Ok(()) diff --git a/src/haystack/filter/nodes.rs b/src/haystack/filter/nodes.rs index 4d8e2d2..3cd66f2 100644 --- a/src/haystack/filter/nodes.rs +++ b/src/haystack/filter/nodes.rs @@ -369,7 +369,7 @@ impl Eval for WildcardEq { impl Display for WildcardEq { fn fmt(&self, f: &mut Formatter<'_>) -> Result { - write!(f, "{} *== {}", &self.id, &self.ref_value) + write!(f, "{} *== {}", self.id, self.ref_value) } } diff --git a/src/haystack/units.rs b/src/haystack/units.rs index d36fd8a..99b87bc 100644 --- a/src/haystack/units.rs +++ b/src/haystack/units.rs @@ -38,20 +38,27 @@ pub fn get_unit_or_default(unit: &str) -> &'static Unit { } /// Match units for the dimension +/// +/// Returns each distinct unit (by identity) whose dimension and scale match. A unit that is +/// registered under more than one name/symbol (e.g. `square_inch` is keyed by both +/// `"square_inch"` and `"in²"`) previously appeared multiple times in the result -- once per +/// alias -- causing callers (e.g. [`crate::units::unit::Unit`]'s `Mul`/`Div` operators) to +/// spuriously treat an unambiguous match as ambiguous. Matches are now deduplicated by pointer +/// identity so each unit is returned at most once regardless of how many aliases it has. #[allow(unused_variables)] pub fn match_units(dim: UnitDimensions, scale: f64) -> Vec<&'static Unit> { #[cfg(feature = "units-db")] { - units_generated::UNITS - .values() - .filter_map(|u| { - if u.dimensions.as_ref() == Some(&dim) && approx_eq(u.scale, scale) { - Some(*u) - } else { - None - } - }) - .collect() + let mut matches: Vec<&'static Unit> = Vec::new(); + for u in units_generated::UNITS.values() { + if u.dimensions.as_ref() == Some(&dim) + && approx_eq(u.scale, scale) + && !matches.iter().any(|m| std::ptr::eq(*m, *u)) + { + matches.push(u); + } + } + matches } #[cfg(not(feature = "units-db"))] return Vec::default(); diff --git a/src/haystack/units/unit.rs b/src/haystack/units/unit.rs index 57a9f85..d5821fb 100644 --- a/src/haystack/units/unit.rs +++ b/src/haystack/units/unit.rs @@ -86,7 +86,7 @@ impl Mul<&'static Unit> for &Unit { Err(format!( "Cannot match units {this}*{other}", this = self.name(), - other = &other.name() + other = other.name() )) }; } @@ -130,7 +130,7 @@ impl Div<&'static Unit> for &Unit { Err(format!( "Cannot match units {this}/{other}", this = self.name(), - other = &other.name() + other = other.name() )) }; } @@ -235,4 +235,43 @@ mod test { let u2 = get_unit("hour").expect("Unit"); assert!((u1 / u2).is_err()); } + + /// Regression: `square_inch` is registered under two aliases (`"square_inch"` and + /// `"in²"`), both mapping to the same `Unit`. `match_units` used to count that as two + /// ambiguous matches instead of one, so this previously failed with + /// "Cannot match units inch*inch" even though `square_inch` is the single unique unit + /// for that dimension/scale. + #[test] + fn test_unit_multiply_result_with_multiple_aliases_is_not_ambiguous() { + let inch = get_unit("inch").expect("Unit"); + assert_eq!(inch * inch, Ok(get_unit("square_inch").expect("Unit"))); + } + + /// Regression companion to the multiply case above, via division: + /// `cubic_meter / meter -> square_meter` (`square_meter` is aliased as `"square_meter"` + /// and `"m²"`). + #[test] + fn test_unit_divide_result_with_multiple_aliases_is_not_ambiguous() { + let cubic_meter = get_unit("cubic_meter").expect("Unit"); + let meter = get_unit("m").expect("Unit"); + assert_eq!( + cubic_meter / meter, + Ok(get_unit("square_meter").expect("Unit")) + ); + } + + #[test] + fn test_match_units_deduplicates_units_with_multiple_aliases() { + let square_inch = get_unit("square_inch").expect("Unit"); + let matches = super::super::match_units( + square_inch.dimensions.expect("dimensions"), + square_inch.scale, + ); + assert_eq!( + matches.len(), + 1, + "expected exactly one match, got {matches:?}" + ); + assert!(std::ptr::eq(matches[0], square_inch)); + } } diff --git a/src/haystack/val/grid.rs b/src/haystack/val/grid.rs index 49f7510..891803e 100644 --- a/src/haystack/val/grid.rs +++ b/src/haystack/val/grid.rs @@ -196,6 +196,16 @@ impl<'a> Iterator for IterHelper<'a> { } /// Implement `IntoIterator` for `Grid` +impl IntoIterator for Grid { + type Item = Dict; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.rows.into_iter() + } +} + +/// Implement `IntoIterator` for `&Grid` impl<'a> IntoIterator for &'a Grid { type Item = &'a Dict; type IntoIter = IterHelper<'a>; diff --git a/src/haystack/val/number.rs b/src/haystack/val/number.rs index 40d22b7..2cc9179 100644 --- a/src/haystack/val/number.rs +++ b/src/haystack/val/number.rs @@ -221,10 +221,8 @@ impl Mul for Number { } else if other.unit.is_none() { self.unit } else { - match self.unit.unwrap_or(&DEFAULT_UNIT) * other.unit.unwrap_or(&DEFAULT_UNIT) { - Ok(u) => Some(u), - Err(err) => return Err(err), - } + let u = (self.unit.unwrap_or(&DEFAULT_UNIT) * other.unit.unwrap_or(&DEFAULT_UNIT))?; + Some(u) }; Ok(Number::make_with_unit( @@ -244,10 +242,8 @@ impl Div for Number { } else if other.unit.is_none() { self.unit } else { - match self.unit.unwrap_or(&DEFAULT_UNIT) / other.unit.unwrap_or(&DEFAULT_UNIT) { - Ok(u) => Some(u), - Err(err) => return Err(err), - } + let u = (self.unit.unwrap_or(&DEFAULT_UNIT) / other.unit.unwrap_or(&DEFAULT_UNIT))?; + Some(u) }; Ok(Number::make_with_unit( diff --git a/tests/values/test_grid.rs b/tests/values/test_grid.rs index 7b1e724..e6587c9 100644 --- a/tests/values/test_grid.rs +++ b/tests/values/test_grid.rs @@ -69,7 +69,8 @@ fn test_grid_iterator() { let grid = Grid::try_from(&value).unwrap(); let mut pos = 0; - for rec in grid.into_iter() { + + for rec in &grid { if pos == 0 { assert_eq!(rec, &grid[pos]) } diff --git a/unit-gen/src/parser.rs b/unit-gen/src/parser.rs index 62bedbc..682b0a5 100644 --- a/unit-gen/src/parser.rs +++ b/unit-gen/src/parser.rs @@ -120,13 +120,7 @@ pub(super) fn parse_unit<'a>() -> Parser<'a, u8, Unit> { cur }) }) - .and_then(|u| { - if u == UnitDimensions::default() { - None - } else { - Some(u) - } - }), + .filter(|&u| u != UnitDimensions::default()), quantity: QUANTITY.with(|tlv| tlv.borrow().clone()).map(Cow::from), scale: dims .as_ref()