use crate::output::write_ip_lists_to_files;
use crate::parse::parse_ip_lines;
use ipnet::IpNet;
use std::collections::BTreeSet;
pub async fn process_country_code(
country_code: &str,
rir_texts: &[String],
mode: &str,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let (ipv4_set, ipv6_set) = parse_and_collect_ips(country_code, rir_texts)?;
write_ip_lists_to_files(country_code, &ipv4_set, &ipv6_set, mode)?;
Ok(())
}
fn parse_and_collect_ips(
country_code: &str,
rir_texts: &[String],
) -> Result<(BTreeSet<IpNet>, BTreeSet<IpNet>), Box<dyn std::error::Error + Send + Sync>> {
let mut ipv4_vec = Vec::new();
let mut ipv6_vec = Vec::new();
for text in rir_texts {
match parse_ip_lines(text, country_code) {
Ok((v4, v6)) => {
ipv4_vec.extend(v4);
ipv6_vec.extend(v6);
}
Err(e) => {
eprintln!(
"[parse_and_collect_ips] Error parsing for country code '{}': {}",
country_code, e
);
}
}
}
ipv4_vec.sort();
ipv6_vec.sort();
let ipv4_set = ipv4_vec.into_iter().collect::<BTreeSet<IpNet>>();
let ipv6_set = ipv6_vec.into_iter().collect::<BTreeSet<IpNet>>();
Ok((ipv4_set, ipv6_set))
}