1use crate::{output::write_ip_lists_to_files, parse::parse_ip_lines};
2use ipnet::IpNet;
3use std::collections::BTreeSet;
4
5pub async fn process_country_code(
8 country_code: &str,
9 rir_texts: &[String],
10 mode: &str,
11) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
12 let (ipv4_set, ipv6_set) = parse_and_collect_ips(country_code, rir_texts)?;
13 write_ip_lists_to_files(country_code, &ipv4_set, &ipv6_set, mode)?;
15 Ok(())
16}
17
18pub fn parse_and_collect_ips(
20 country_code: &str,
21 rir_texts: &[String],
22) -> Result<(BTreeSet<IpNet>, BTreeSet<IpNet>), Box<dyn std::error::Error + Send + Sync>> {
23 let mut ipv4_vec = Vec::new();
24 let mut ipv6_vec = Vec::new();
25
26 for text in rir_texts {
27 match parse_ip_lines(text, country_code) {
28 Ok((v4, v6)) => {
29 ipv4_vec.extend(v4);
30 ipv6_vec.extend(v6);
31 }
32 Err(e) => eprintln!(
33 "[parse_and_collect_ips] Error parsing for country '{}': {}",
34 country_code, e
35 ),
36 }
37 }
38
39 ipv4_vec.sort();
40 ipv6_vec.sort();
41
42 let ipv4_set = ipv4_vec.into_iter().collect::<BTreeSet<_>>();
43 let ipv6_set = ipv6_vec.into_iter().collect::<BTreeSet<_>>();
44
45 Ok((ipv4_set, ipv6_set))
46}