1#[cfg(feature = "diesel")]
28#[macro_use]
29extern crate diesel;
30
31#[cfg(feature = "diesel")]
32pub mod diesel_support;
34mod helpers;
35mod ip_network;
36mod ipv4_network;
37mod ipv6_network;
38pub mod iterator;
40#[cfg(any(feature = "diesel", feature = "postgres"))]
41mod postgres_common;
42#[cfg(feature = "postgres")]
43mod postgres_support;
44#[cfg(feature = "serde")]
45mod serde_support;
46
47use std::error::Error;
48use std::fmt;
49
50pub use self::ip_network::IpNetwork;
51pub use self::ipv4_network::Ipv4Network;
52pub use self::ipv6_network::{Ipv6MulticastScope, Ipv6Network};
53
54#[derive(Debug, PartialEq)]
56pub enum IpNetworkError {
57 NetmaskError(u8),
59 HostBitsSet,
61}
62
63impl Error for IpNetworkError {}
64
65impl fmt::Display for IpNetworkError {
66 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
67 let description = match *self {
68 IpNetworkError::NetmaskError(_) => "invalid netmask",
69 IpNetworkError::HostBitsSet => "IP network address has host bits set",
70 };
71 write!(fmt, "{}", description)
72 }
73}
74
75#[derive(Debug, PartialEq)]
77pub enum IpNetworkParseError {
78 InvalidNetmaskFormat,
80 InvalidFormatError,
82 AddrParseError,
84 IpNetworkError(IpNetworkError),
86}
87
88impl Error for IpNetworkParseError {
89 fn source(&self) -> Option<&(dyn Error + 'static)> {
90 match *self {
91 IpNetworkParseError::IpNetworkError(ref ip_network_error) => Some(ip_network_error),
92 _ => None,
93 }
94 }
95}
96
97impl fmt::Display for IpNetworkParseError {
98 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
99 match *self {
100 IpNetworkParseError::InvalidNetmaskFormat => write!(fmt, "invalid netmask format"),
101 IpNetworkParseError::InvalidFormatError => write!(fmt, "invalid format"),
102 IpNetworkParseError::AddrParseError => write!(fmt, "invalid IP address syntax"),
103 IpNetworkParseError::IpNetworkError(ref ip_network_error) => {
104 write!(fmt, "{}", ip_network_error)
105 }
106 }
107 }
108}