From 9bba659cd5e983da27d5ba73b6b4eff215884fe1 Mon Sep 17 00:00:00 2001 From: PsypherPunk Date: Wed, 12 Feb 2025 10:52:37 +0000 Subject: [PATCH] feat: preserve IP address order as part of #651, IP addresses are deduplicated; as this uses a `BTreeSet`, the original order is not necessarily retained. use [`retain()`](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.retain) to remove duplicated and/or excluded IPs, mutating the original list of IPs but preserving the original order. --- src/address.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/address.rs b/src/address.rs index 83e6b0c86..449090418 100644 --- a/src/address.rs +++ b/src/address.rs @@ -70,18 +70,18 @@ pub fn parse_addresses(input: &Opts) -> Vec { } // Finally, craft a list of addresses to be excluded from the scan. - let mut excluded_ips: Vec = Vec::new(); + let mut excluded_ips: BTreeSet = BTreeSet::new(); if let Some(exclude_addresses) = &input.exclude_addresses { for addr in exclude_addresses { excluded_ips.extend(parse_address(addr, &backup_resolver)); } } - ips.into_iter() - .collect::>() - .into_iter() - .filter(|ip| !excluded_ips.contains(ip)) - .collect() + // Remove duplicated/excluded IPs. + let mut seen = BTreeSet::new(); + ips.retain(|ip| seen.insert(*ip) && !excluded_ips.contains(ip)); + + ips } /// Given a string, parse it as a host, IP address, or CIDR.