cidr_utils/
lib.rs

1/*!
2# CIDR Utils
3
4This crate provides functions for working with IPv4 CIDRs and IPv6 CIDRs.
5
6## Examples
7
8Combine subnetworks to supernetworks.
9
10```rust
11# #[cfg(feature = "combiner")]
12# {
13use std::str::FromStr;
14
15use cidr::Ipv4Cidr;
16use cidr_utils::Ipv4CidrSize;
17use cidr_utils::combiner::Ipv4CidrCombiner;
18
19let mut combiner = Ipv4CidrCombiner::new();
20
21combiner.push(Ipv4Cidr::from_str("192.168.51.100").unwrap());
22
23assert_eq!(1, combiner.len());
24assert_eq!("192.168.51.100".to_string(), combiner[0].to_string());
25
26combiner.push(Ipv4Cidr::from_str("192.168.51.101").unwrap());
27
28assert_eq!(1, combiner.len());
29assert_eq!("192.168.51.100/31".to_string(), combiner[0].to_string());
30
31combiner.push(Ipv4Cidr::from_str("192.168.51.102").unwrap());
32
33assert_eq!(2, combiner.len());
34assert_eq!("192.168.51.100/31".to_string(), combiner[0].to_string());
35assert_eq!("192.168.51.102".to_string(), combiner[1].to_string());
36
37combiner.push(Ipv4Cidr::from_str("192.168.51.103").unwrap());
38
39assert_eq!(1, combiner.len());
40assert_eq!("192.168.51.100/30".to_string(), combiner[0].to_string());
41
42assert_eq!(true, combiner.contains(&[192, 168, 51, 102].into()));
43assert_eq!(false, combiner.contains(&[192, 168, 51, 105].into()));
44
45assert_eq!(4, combiner.size());
46# }
47```
48
49Separate a network into subnetworks.
50
51```rust
52# #[cfg(feature = "separator")]
53# {
54use std::str::FromStr;
55
56use cidr::Ipv4Cidr;
57use cidr_utils::Ipv4CidrSize;
58use cidr_utils::separator::Ipv4CidrSeparator;
59
60let cidr = Ipv4Cidr::from_str("192.168.56.0/24").unwrap();
61
62let result = Ipv4CidrSeparator::divide_by(&cidr, 4).unwrap();
63
64assert_eq!(4, result.len());
65assert_eq!(64, result[0].size());
66assert_eq!(64, result[1].size());
67assert_eq!(64, result[2].size());
68assert_eq!(64, result[3].size());
69
70assert_eq!("[192.168.56.0/26]".to_string(), result[0].to_string());
71assert_eq!("[192.168.56.64/26]".to_string(), result[1].to_string());
72assert_eq!("[192.168.56.128/26]".to_string(), result[2].to_string());
73assert_eq!("[192.168.56.192/26]".to_string(), result[3].to_string());
74
75let result = Ipv4CidrSeparator::divide_by(&cidr, 5).unwrap();
76
77assert_eq!(5, result.len());
78assert_eq!(51, result[0].size());
79assert_eq!(51, result[1].size());
80assert_eq!(51, result[2].size());
81assert_eq!(51, result[3].size());
82assert_eq!(52, result[4].size());
83
84assert_eq!("[192.168.56.0/27, 192.168.56.32/28, 192.168.56.48/31, 192.168.56.50/32]".to_string(), result[0].to_string());
85assert_eq!("[192.168.56.51/32, 192.168.56.52/30, 192.168.56.56/29, 192.168.56.64/27, 192.168.56.96/30, 192.168.56.100/31]".to_string(), result[1].to_string());
86assert_eq!("[192.168.56.102/31, 192.168.56.104/29, 192.168.56.112/28, 192.168.56.128/28, 192.168.56.144/29, 192.168.56.152/32]".to_string(), result[2].to_string());
87assert_eq!("[192.168.56.153/32, 192.168.56.154/31, 192.168.56.156/30, 192.168.56.160/27, 192.168.56.192/29, 192.168.56.200/30]".to_string(), result[3].to_string());
88assert_eq!("[192.168.56.204/30, 192.168.56.208/28, 192.168.56.224/27]".to_string(), result[4].to_string());
89
90let result = Ipv4CidrSeparator::sub_networks(&cidr, 26).unwrap();
91
92assert_eq!(4, result.len());
93assert_eq!(64, result[0].size());
94assert_eq!(64, result[1].size());
95assert_eq!(64, result[2].size());
96assert_eq!(64, result[3].size());
97
98assert_eq!("192.168.56.0/26".to_string(), result[0].to_string());
99assert_eq!("192.168.56.64/26".to_string(), result[1].to_string());
100assert_eq!("192.168.56.128/26".to_string(), result[2].to_string());
101assert_eq!("192.168.56.192/26".to_string(), result[3].to_string());
102# }
103```
104*/
105
106#![cfg_attr(docsrs, feature(doc_auto_cfg))]
107
108#[cfg(feature = "combiner")]
109pub mod combiner;
110#[cfg(feature = "iterator")]
111pub mod iterator;
112#[cfg(feature = "separator")]
113pub mod separator;
114mod traits;
115
116pub extern crate cidr;
117
118pub use traits::*;