1use crate::output::sort_and_write;
2use crate::parse::parse_ip_lines;
3use ipnet::IpNet;
4use std::collections::BTreeSet;
5
6pub async fn process_country_code(
9 country_code: &str,
10 rir_texts: &[String],
11) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
12 let (ipv4_set, ipv6_set) = parse_and_collect_ips(country_code, rir_texts)?;
14 sort_and_write(country_code, &ipv4_set, &ipv6_set)?;
16
17 Ok(())
18}
19
20fn parse_and_collect_ips(
22 country_code: &str,
23 rir_texts: &[String],
24) -> Result<(BTreeSet<IpNet>, BTreeSet<IpNet>), Box<dyn std::error::Error + Send + Sync>> {
25 let mut ipv4_list = BTreeSet::new();
26 let mut ipv6_list = BTreeSet::new();
27
28 for text in rir_texts {
29 let (v4, v6) = match parse_ip_lines(text, country_code) {
30 Ok(pair) => pair,
31 Err(e) => {
32 eprintln!("パースでエラー (国コード: {}): {}", country_code, e);
33 continue;
34 }
35 };
36 ipv4_list.extend(v4);
37 ipv6_list.extend(v6);
38 }
39
40 Ok((ipv4_list, ipv6_list))
41}