fire_scope/
process.rs

1use crate::{output::write_ip_lists_to_files, parse::parse_ip_lines};
2use ipnet::IpNet;
3use std::collections::BTreeSet;
4
5/// 指定された国コードと、ダウンロード済みのRIRファイル文字列から、
6/// IPアドレスをパースしてファイル書き込みまで実行する。
7pub 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    // 結果をファイルに書き出す
14    write_ip_lists_to_files(country_code, &ipv4_set, &ipv6_set, mode)?;
15    Ok(())
16}
17
18/// 全RIRテキストから、指定国コードに合致するIPアドレスをすべて集約し、BTreeSetとして返す。
19pub 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}