Skip to main content

bgpkit_commons/peeringdb/
tables.rs

1//! PeeringDB table structs — faithful mirrors of the PeeringDB API responses.
2//!
3//! Each struct captures all fields returned by its corresponding API endpoint.
4//! Fields use `Option<T>` where the API may return `null`.
5
6use serde::{Deserialize, Serialize};
7
8use super::HasId;
9
10/// Social media entry (appears in several endpoints).
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct SocialMediaEntry {
13    pub service: String,
14    pub identifier: String,
15}
16
17// ===========================================================================
18// /net — Network (AS) information
19// ===========================================================================
20
21/// PeeringDB network (`/net`) — full record with all API fields.
22///
23/// One record per registered autonomous system in PeeringDB.
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct Network {
26    #[serde(default)]
27    pub id: u32,
28    pub asn: Option<u32>,
29    pub name: Option<String>,
30    pub name_long: Option<String>,
31    pub aka: Option<String>,
32    pub org_id: Option<u32>,
33    pub irr_as_set: Option<String>,
34    pub website: Option<String>,
35
36    // Network characteristics
37    pub info_traffic: Option<String>,
38    pub info_scope: Option<String>,
39    pub info_type: Option<String>,
40    pub info_types: Option<Vec<String>>,
41    pub info_ratio: Option<String>,
42    pub info_prefixes4: Option<u32>,
43    pub info_prefixes6: Option<u32>,
44    pub info_ipv6: Option<bool>,
45    pub info_unicast: Option<bool>,
46    pub info_multicast: Option<bool>,
47    pub info_never_via_route_servers: Option<bool>,
48
49    // Peering policy
50    pub policy_general: Option<String>,
51    pub policy_url: Option<String>,
52    pub policy_contracts: Option<String>,
53    pub policy_locations: Option<String>,
54    pub policy_ratio: Option<bool>,
55
56    // IXP / facility links
57    pub route_server: Option<String>,
58    pub looking_glass: Option<String>,
59    pub ix_count: Option<u32>,
60    pub fac_count: Option<u32>,
61
62    // Administrative
63    pub status: Option<String>,
64    pub allow_ixp_update: Option<bool>,
65    pub social_media: Option<Vec<SocialMediaEntry>>,
66    pub notes: Option<String>,
67    pub rir_status: Option<String>,
68    pub rir_status_updated: Option<String>,
69    pub status_dashboard: Option<String>,
70    pub poc_updated: Option<String>,
71    pub netixlan_updated: Option<String>,
72    pub netfac_updated: Option<String>,
73    pub created: Option<String>,
74    pub updated: Option<String>,
75}
76
77impl HasId for Network {
78    fn id(&self) -> u32 {
79        self.id
80    }
81}
82
83// ===========================================================================
84// /ix — Internet exchange point
85// ===========================================================================
86
87/// PeeringDB internet exchange (`/ix`) — full record.
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct InternetExchange {
90    pub id: u32,
91    pub name: String,
92    pub name_long: Option<String>,
93    pub aka: Option<String>,
94    pub org_id: Option<u32>,
95
96    // Location
97    pub city: Option<String>,
98    pub country: Option<String>,
99    pub region_continent: Option<String>,
100
101    // Protocols
102    pub proto_unicast: Option<bool>,
103    pub proto_ipv6: Option<bool>,
104    pub proto_multicast: Option<bool>,
105
106    // Statistics
107    pub net_count: Option<u32>,
108    pub fac_count: Option<u32>,
109    pub ixf_net_count: Option<u32>,
110
111    // Service level
112    pub media: Option<String>,
113    pub service_level: Option<String>,
114    pub terms: Option<String>,
115
116    // Contact
117    pub website: Option<String>,
118    pub url_stats: Option<String>,
119    pub tech_email: Option<String>,
120    pub tech_phone: Option<String>,
121    pub policy_email: Option<String>,
122    pub policy_phone: Option<String>,
123    pub sales_email: Option<String>,
124    pub sales_phone: Option<String>,
125
126    // IX-F import
127    pub ixf_import_request: Option<String>,
128    pub ixf_import_request_status: Option<String>,
129    pub ixf_last_import: Option<String>,
130
131    // Administrative
132    pub status: Option<String>,
133    pub status_dashboard: Option<String>,
134    pub notes: Option<String>,
135    pub social_media: Option<Vec<SocialMediaEntry>>,
136    pub created: Option<String>,
137    pub updated: Option<String>,
138}
139
140impl HasId for InternetExchange {
141    fn id(&self) -> u32 {
142        self.id
143    }
144}
145
146// ===========================================================================
147// /ixlan — IXP peering LAN
148// ===========================================================================
149
150/// PeeringDB IXP peering LAN (`/ixlan`) — full record.
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct IxLan {
153    pub id: u32,
154    pub ix_id: u32,
155    pub name: Option<String>,
156    pub descr: Option<String>,
157    pub mtu: Option<u32>,
158    pub rs_asn: Option<u32>,
159    pub dot1q_support: Option<bool>,
160    pub arp_sponge: Option<String>,
161    pub ixf_ixp_import_enabled: Option<bool>,
162    pub ixf_ixp_member_list_url_visible: Option<String>,
163    pub status: Option<String>,
164    pub created: Option<String>,
165    pub updated: Option<String>,
166}
167
168impl HasId for IxLan {
169    fn id(&self) -> u32 {
170        self.id
171    }
172}
173
174// ===========================================================================
175// /ixpfx — IXP peering LAN prefix
176// ===========================================================================
177
178/// PeeringDB IXP prefix (`/ixpfx`) — peering LAN prefix.
179#[derive(Debug, Clone, Serialize, Deserialize)]
180pub struct IxPrefix {
181    pub id: u32,
182    pub prefix: String,
183    pub protocol: String,
184    pub ixlan_id: u32,
185    pub in_dfz: bool,
186    pub status: Option<String>,
187    pub created: Option<String>,
188    pub updated: Option<String>,
189}
190
191impl HasId for IxPrefix {
192    fn id(&self) -> u32 {
193        self.id
194    }
195}
196
197// ===========================================================================
198// /netixlan — Network–IXP membership
199// ===========================================================================
200
201/// PeeringDB network–IXP membership (`/netixlan`) — represents an AS's
202/// presence at a specific IXP peering LAN.
203#[derive(Debug, Clone, Serialize, Deserialize)]
204pub struct NetworkIxLan {
205    pub id: u32,
206    pub asn: u32,
207    pub net_id: u32,
208    pub ix_id: u32,
209    pub ixlan_id: u32,
210    pub name: Option<String>,
211    pub speed: u64,
212    pub is_rs_peer: bool,
213    pub operational: bool,
214    pub bfd_support: Option<bool>,
215    pub ipaddr4: Option<String>,
216    pub ipaddr6: Option<String>,
217    pub notes: Option<String>,
218    pub ix_side_id: Option<u32>,
219    pub net_side_id: Option<u32>,
220    pub status: Option<String>,
221    pub created: Option<String>,
222    pub updated: Option<String>,
223}
224
225impl HasId for NetworkIxLan {
226    fn id(&self) -> u32 {
227        self.id
228    }
229}
230
231// ===========================================================================
232// /fac — Facility (data center)
233// ===========================================================================
234
235/// PeeringDB facility (`/fac`) — full record.
236#[derive(Debug, Clone, Serialize, Deserialize)]
237pub struct Facility {
238    pub id: u32,
239    pub name: String,
240    pub name_long: Option<String>,
241    pub aka: Option<String>,
242    pub org_id: Option<u32>,
243    pub org_name: Option<String>,
244    pub campus_id: Option<u32>,
245
246    // Location
247    pub address1: Option<String>,
248    pub address2: Option<String>,
249    pub city: Option<String>,
250    pub state: Option<String>,
251    pub country: Option<String>,
252    pub zipcode: Option<String>,
253    pub region_continent: Option<String>,
254    pub latitude: Option<f64>,
255    pub longitude: Option<f64>,
256    pub clli: Option<String>,
257    pub npanxx: Option<String>,
258    pub floor: Option<String>,
259    pub suite: Option<String>,
260    pub property: Option<String>,
261    pub rencode: Option<String>,
262    pub diverse_serving_substations: Option<bool>,
263
264    // Statistics
265    pub net_count: Option<u32>,
266    pub ix_count: Option<u32>,
267    pub carrier_count: Option<u32>,
268
269    // Utilities
270    pub available_voltage_services: Option<Vec<String>>,
271
272    // Contact
273    pub website: Option<String>,
274    pub tech_email: Option<String>,
275    pub tech_phone: Option<String>,
276    pub sales_email: Option<String>,
277    pub sales_phone: Option<String>,
278
279    // Administrative
280    pub status: Option<String>,
281    pub status_dashboard: Option<String>,
282    pub notes: Option<String>,
283    pub social_media: Option<Vec<SocialMediaEntry>>,
284    pub created: Option<String>,
285    pub updated: Option<String>,
286}
287
288impl HasId for Facility {
289    fn id(&self) -> u32 {
290        self.id
291    }
292}
293
294// ===========================================================================
295// /netfac — Network–facility co-location
296// ===========================================================================
297
298/// PeeringDB network–facility co-location (`/netfac`).
299#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct NetworkFacility {
301    pub id: u32,
302    pub net_id: u32,
303    pub fac_id: u32,
304    pub local_asn: u32,
305    pub name: Option<String>,
306    pub city: Option<String>,
307    pub country: Option<String>,
308    pub status: Option<String>,
309    pub created: Option<String>,
310    pub updated: Option<String>,
311}
312
313impl HasId for NetworkFacility {
314    fn id(&self) -> u32 {
315        self.id
316    }
317}
318
319// ===========================================================================
320// /ixfac — IXP–facility association
321// ===========================================================================
322
323/// PeeringDB IXP–facility association (`/ixfac`).
324#[derive(Debug, Clone, Serialize, Deserialize)]
325pub struct IxFacility {
326    pub id: u32,
327    pub ix_id: u32,
328    pub fac_id: u32,
329    pub name: Option<String>,
330    pub city: Option<String>,
331    pub country: Option<String>,
332    pub status: Option<String>,
333    pub created: Option<String>,
334    pub updated: Option<String>,
335}
336
337impl HasId for IxFacility {
338    fn id(&self) -> u32 {
339        self.id
340    }
341}
342
343// ===========================================================================
344// /org — Organization
345// ===========================================================================
346
347/// PeeringDB organization (`/org`) — full record.
348#[derive(Debug, Clone, Serialize, Deserialize)]
349pub struct Organization {
350    pub id: u32,
351    pub name: String,
352    pub name_long: Option<String>,
353    pub aka: Option<String>,
354
355    // Location
356    pub address1: Option<String>,
357    pub address2: Option<String>,
358    pub city: Option<String>,
359    pub state: Option<String>,
360    pub country: Option<String>,
361    pub zipcode: Option<String>,
362    pub latitude: Option<f64>,
363    pub longitude: Option<f64>,
364    pub floor: Option<String>,
365    pub suite: Option<String>,
366
367    // Contact
368    pub website: Option<String>,
369
370    // Administrative
371    pub status: Option<String>,
372    pub notes: Option<String>,
373    pub social_media: Option<Vec<SocialMediaEntry>>,
374    pub created: Option<String>,
375    pub updated: Option<String>,
376}
377
378impl HasId for Organization {
379    fn id(&self) -> u32 {
380        self.id
381    }
382}
383
384// ===========================================================================
385// /campus — Facility campus
386// ===========================================================================
387
388/// PeeringDB campus (`/campus`) — a group of co-located facilities.
389#[derive(Debug, Clone, Serialize, Deserialize)]
390pub struct Campus {
391    pub id: u32,
392    pub name: String,
393    pub name_long: Option<String>,
394    pub aka: Option<String>,
395    pub org_id: Option<u32>,
396    pub org_name: Option<String>,
397
398    // Location
399    pub city: Option<String>,
400    pub state: Option<String>,
401    pub country: Option<String>,
402    pub zipcode: Option<String>,
403
404    // Contact
405    pub website: Option<String>,
406
407    // Administrative
408    pub status: Option<String>,
409    pub notes: Option<String>,
410    pub social_media: Option<Vec<SocialMediaEntry>>,
411    pub created: Option<String>,
412    pub updated: Option<String>,
413}
414
415impl HasId for Campus {
416    fn id(&self) -> u32 {
417        self.id
418    }
419}
420
421// ===========================================================================
422// /carrier — Transport carrier
423// ===========================================================================
424
425/// PeeringDB carrier (`/carrier`) — a transport provider.
426#[derive(Debug, Clone, Serialize, Deserialize)]
427pub struct Carrier {
428    pub id: u32,
429    pub name: String,
430    pub name_long: Option<String>,
431    pub aka: Option<String>,
432    pub org_id: Option<u32>,
433    pub org_name: Option<String>,
434
435    // Statistics
436    pub fac_count: Option<u32>,
437
438    // Contact
439    pub website: Option<String>,
440
441    // Administrative
442    pub status: Option<String>,
443    pub notes: Option<String>,
444    pub social_media: Option<Vec<SocialMediaEntry>>,
445    pub created: Option<String>,
446    pub updated: Option<String>,
447}
448
449impl HasId for Carrier {
450    fn id(&self) -> u32 {
451        self.id
452    }
453}
454
455// ===========================================================================
456// /carrierfac — Carrier–facility association
457// ===========================================================================
458
459/// PeeringDB carrier–facility association (`/carrierfac`).
460#[derive(Debug, Clone, Serialize, Deserialize)]
461pub struct CarrierFacility {
462    pub id: u32,
463    pub carrier_id: u32,
464    pub fac_id: u32,
465    pub name: Option<String>,
466    pub status: Option<String>,
467    pub created: Option<String>,
468    pub updated: Option<String>,
469}
470
471impl HasId for CarrierFacility {
472    fn id(&self) -> u32 {
473        self.id
474    }
475}