fetch_ccip/
process.rs

1use crate::output::sort_and_write;
2use crate::parse::parse_ip_lines;
3use ipnet::IpNet;
4use std::collections::BTreeSet;
5
6/// 国コードと、すでにダウンロード済みのRIRファイル文字列を受け取り、
7/// パースしてファイル書き込みまで行う。
8pub async fn process_country_code(
9    country_code: &str,
10    rir_texts: &[String],
11) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
12    // パース結果をまとめる(BTreeSetで重複排除+自動ソート)
13    let (ipv4_set, ipv6_set) = parse_and_collect_ips(country_code, rir_texts)?;
14    // 結果をファイルに書き出す
15    sort_and_write(country_code, &ipv4_set, &ipv6_set)?;
16
17    Ok(())
18}
19
20/// 指定国コードに合致するIPアドレスをすべて集約し、BTreeSetとして返す
21fn 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}