1use crate::data::utils::get_reader;
2use anyhow::Result;
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Serialize, Deserialize)]
8pub struct PeeringdbNet {
9 pub id: u32,
10 pub name: Option<String>,
11 pub name_long: Option<String>,
12 pub aka: Option<String>,
13 pub asn: Option<u32>,
14 pub org_id: Option<u32>,
15 pub irr_as_set: Option<String>,
16 pub website: Option<String>,
17 pub notes: Option<String>,
18 pub fac_count: Option<usize>,
19 pub ix_count: Option<u32>,
20
21 pub policy_contracts: Option<String>,
22 pub policy_general: Option<String>,
23 pub policy_locations: Option<String>,
24 pub policy_ratio: Option<bool>,
25 pub policy_url: Option<String>,
26
27 pub info_ipv6: Option<bool>,
28 pub info_multicast: Option<bool>,
29 pub info_never_via_route_servers: Option<bool>,
30 pub info_prefixes4: Option<u32>,
31 pub info_prefixes6: Option<u32>,
32 pub info_ratio: Option<String>,
33 pub info_scope: Option<String>,
34 pub info_traffic: Option<String>,
35 pub info_type: Option<String>,
36 pub info_types: Option<Vec<String>>,
37 pub info_unicast: Option<bool>,
38
39 pub rir_status: Option<String>,
40 pub status: Option<String>,
41 pub status_dashboard: Option<String>,
42 pub created: Option<String>,
43 pub updated: Option<String>,
44 pub netfac_updated: Option<DateTime<Utc>>,
45 pub netixlan_updated: Option<DateTime<Utc>>,
46 pub rir_status_updated: Option<DateTime<Utc>>,
47 pub poc_updated: Option<String>,
48 pub route_server: Option<String>,
49 pub social_media: Option<Vec<Value>>,
50 pub looking_glass: Option<String>,
51}
52
53#[derive(Debug, Serialize, Deserialize)]
54struct PeeringdbNetResponse {
55 data: Vec<PeeringdbNet>,
56}
57
58pub fn load_peeringdb_net() -> Result<Vec<PeeringdbNet>> {
59 let mut reader = get_reader("https://www.peeringdb.com/api/net")?;
60 let mut buf = String::new();
61 reader.read_to_string(&mut buf)?;
62 let res: PeeringdbNetResponse = serde_json::from_str(&buf)?;
63 Ok(res.data)
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn test_loading_data() {
72 let data = load_peeringdb_net();
73 assert!(data.is_ok());
74 }
75}