Merge pull request #109 from mullvad/optional-serde

Make the serde dependency optional
This commit is contained in:
Abhishek Chanda
2019-12-13 16:23:08 +00:00
committed by GitHub
6 changed files with 28 additions and 20 deletions

View File

@ -9,6 +9,8 @@ env:
- FEATURES: default - FEATURES: default
script: script:
- cargo build --verbose --no-default-features
- cargo test --verbose --no-default-features
- cargo build --verbose - cargo build --verbose
- cargo test --verbose - cargo test --verbose
- cargo build --release --verbose - cargo build --release --verbose

View File

@ -12,7 +12,7 @@ edition = "2018"
[dependencies] [dependencies]
clippy = {version = "0.0.302", optional = true} clippy = {version = "0.0.302", optional = true}
serde = ">=0.8.0, <2.0" serde = { version = ">=0.8.0, <2.0", optional = true }
[dev-dependencies] [dev-dependencies]
serde_json = "1.0" serde_json = "1.0"
@ -23,7 +23,7 @@ criterion = "0.3.0"
travis-ci = { repository = "achanda/ipnetwork" } travis-ci = { repository = "achanda/ipnetwork" }
[features] [features]
default = [] default = ["serde"]
dev = ["clippy"] dev = ["clippy"]
[[bench]] [[bench]]

View File

@ -1,5 +1,4 @@
use crate::common::{cidr_parts, parse_prefix, IpNetworkError}; use crate::common::{cidr_parts, parse_prefix, IpNetworkError};
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use std::{fmt, net::Ipv4Addr, str::FromStr}; use std::{fmt, net::Ipv4Addr, str::FromStr};
const IPV4_BITS: u8 = 32; const IPV4_BITS: u8 = 32;
@ -11,20 +10,22 @@ pub struct Ipv4Network {
prefix: u8, prefix: u8,
} }
impl<'de> Deserialize<'de> for Ipv4Network { #[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for Ipv4Network {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where
D: Deserializer<'de>, D: serde::Deserializer<'de>,
{ {
let s = <String>::deserialize(deserializer)?; let s = <String>::deserialize(deserializer)?;
Ipv4Network::from_str(&s).map_err(de::Error::custom) Ipv4Network::from_str(&s).map_err(serde::de::Error::custom)
} }
} }
impl Serialize for Ipv4Network { #[cfg(feature = "serde")]
impl serde::Serialize for Ipv4Network {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
S: Serializer, S: serde::Serializer,
{ {
serializer.serialize_str(&self.to_string()) serializer.serialize_str(&self.to_string())
} }

View File

@ -1,5 +1,4 @@
use crate::common::{cidr_parts, parse_prefix, IpNetworkError}; use crate::common::{cidr_parts, parse_prefix, IpNetworkError};
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use std::{cmp, fmt, net::Ipv6Addr, str::FromStr}; use std::{cmp, fmt, net::Ipv6Addr, str::FromStr};
const IPV6_BITS: u8 = 128; const IPV6_BITS: u8 = 128;
@ -12,20 +11,22 @@ pub struct Ipv6Network {
prefix: u8, prefix: u8,
} }
impl<'de> Deserialize<'de> for Ipv6Network { #[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for Ipv6Network {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where
D: Deserializer<'de>, D: serde::Deserializer<'de>,
{ {
let s = <String>::deserialize(deserializer)?; let s = <String>::deserialize(deserializer)?;
Ipv6Network::from_str(&s).map_err(de::Error::custom) Ipv6Network::from_str(&s).map_err(serde::de::Error::custom)
} }
} }
impl Serialize for Ipv6Network { #[cfg(feature = "serde")]
impl serde::Serialize for Ipv6Network {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
S: Serializer, S: serde::Serializer,
{ {
serializer.serialize_str(&self.to_string()) serializer.serialize_str(&self.to_string())
} }

View File

@ -6,7 +6,6 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![doc(html_root_url = "https://docs.rs/ipnetwork/0.15.1")] #![doc(html_root_url = "https://docs.rs/ipnetwork/0.15.1")]
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use std::{fmt, net::IpAddr, str::FromStr}; use std::{fmt, net::IpAddr, str::FromStr};
mod common; mod common;
@ -27,20 +26,22 @@ pub enum IpNetwork {
V6(Ipv6Network), V6(Ipv6Network),
} }
impl<'de> Deserialize<'de> for IpNetwork { #[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for IpNetwork {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where
D: Deserializer<'de>, D: serde::Deserializer<'de>,
{ {
let s = <String>::deserialize(deserializer)?; let s = <String>::deserialize(deserializer)?;
IpNetwork::from_str(&s).map_err(de::Error::custom) IpNetwork::from_str(&s).map_err(serde::de::Error::custom)
} }
} }
impl Serialize for IpNetwork { #[cfg(feature = "serde")]
impl serde::Serialize for IpNetwork {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
S: Serializer, S: serde::Serializer,
{ {
serializer.serialize_str(&self.to_string()) serializer.serialize_str(&self.to_string())
} }
@ -359,6 +360,7 @@ pub fn ip_mask_to_prefix(mask: IpAddr) -> Result<u8, IpNetworkError> {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
#[test] #[test]
#[cfg(feature = "serde")]
fn deserialize_from_serde_json_value() { fn deserialize_from_serde_json_value() {
use super::*; use super::*;
let network = IpNetwork::from_str("0.0.0.0/0").unwrap(); let network = IpNetwork::from_str("0.0.0.0/0").unwrap();

View File

@ -1,3 +1,5 @@
#![cfg(feature = "serde")]
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network}; use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network};