Skip to content

Commit

Permalink
Compile serde_derive separately from serde
Browse files Browse the repository at this point in the history
When serde's derive feature is used, serde_derive must be
compiled before serde can be, as serde with that feature has a
serde_derive dependency.

As of serde 1.0.186, this issue can be avoided by adding a separate
serde_derive dependency due to the fact that serde 1.0.186 has a
never-applicable dependency on serde_derive, which ensures that
there is no incompatible version of serde_derive in a program [1].

Because MSRV being set to 1.56, it's not possible to use the dep:
syntax in features, so serde crate needs to be renamed.

This should improve compilation times of programs that use url
with its serde feature, provided it doesn't have other crates that
use serde with its derive feature.

[1]: serde-rs/serde#2588
  • Loading branch information
KamilaBorowska committed Aug 30, 2023
1 parent a08aa2c commit 0d78e8a
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 7 deletions.
6 changes: 4 additions & 2 deletions url/Cargo.toml
Expand Up @@ -17,22 +17,24 @@ edition = "2018"
rust-version = "1.56"

[dev-dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_crate = { package = "serde", version = "1.0", features = ["derive"] }
serde_json = "1.0"
bencher = "0.1"

[dependencies]
form_urlencoded = { version = "1.2.0", path = "../form_urlencoded" }
idna = { version = "0.4.0", path = "../idna" }
percent-encoding = { version = "2.3.0", path = "../percent_encoding" }
serde = { version = "1.0", optional = true, features = ["derive"] }
serde_crate = { package = "serde", version = "1.0.186", optional = true }
serde_derive = { version = "1.0", optional = true }

[features]
default = []
# Enable to use the #[debugger_visualizer] attribute. This feature requires Rust >= 1.71.
debugger_visualizer = []
# Expose internal offsets of the URL.
expose_internals = []
serde = ["serde_crate", "serde_derive"]

[[test]]
name = "url_wpt"
Expand Down
14 changes: 11 additions & 3 deletions url/src/host.rs
Expand Up @@ -12,11 +12,15 @@ use std::net::{Ipv4Addr, Ipv6Addr};

use percent_encoding::{percent_decode, utf8_percent_encode, CONTROLS};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use serde_derive::{Deserialize, Serialize};

use crate::parser::{ParseError, ParseResult};

#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(
feature = "serde",
derive(Deserialize, Serialize),
serde(crate = "serde"),
)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub(crate) enum HostInternal {
None,
Expand All @@ -37,7 +41,11 @@ impl From<Host<String>> for HostInternal {
}

/// The host name of an URL.
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(
feature = "serde",
derive(Deserialize, Serialize),
serde(crate = "serde"),
)]
#[derive(Clone, Debug, Eq, Ord, PartialOrd, Hash)]
pub enum Host<S = String> {
/// A DNS domain name, as '.' dot-separated labels.
Expand Down
2 changes: 1 addition & 1 deletion url/src/lib.rs
Expand Up @@ -143,7 +143,7 @@ url = { version = "2", features = ["debugger_visualizer"] }
pub use form_urlencoded;

#[cfg(feature = "serde")]
extern crate serde;
extern crate serde_crate as serde;

use crate::host::HostInternal;
use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, USERINFO};
Expand Down
9 changes: 8 additions & 1 deletion url/tests/wpt.rs
Expand Up @@ -8,6 +8,8 @@

//! Data-driven tests imported from web-platform-tests

extern crate serde_crate as serde;

use std::collections::HashMap;
use std::fmt::Write;
use std::panic;
Expand All @@ -16,6 +18,7 @@ use serde_json::Value;
use url::Url;

#[derive(Debug, serde::Deserialize)]
#[serde(crate = "serde")]
struct UrlTest {
input: String,
base: Option<String>,
Expand All @@ -24,14 +27,15 @@ struct UrlTest {
}

#[derive(Debug, serde::Deserialize)]
#[serde(untagged)]
#[serde(crate = "serde", untagged)]
#[allow(clippy::large_enum_variant)]
enum UrlTestResult {
Ok(UrlTestOk),
Fail(UrlTestFail),
}

#[derive(Debug, serde::Deserialize)]
#[serde(crate = "serde")]
struct UrlTestOk {
href: String,
protocol: String,
Expand All @@ -46,18 +50,21 @@ struct UrlTestOk {
}

#[derive(Debug, serde::Deserialize)]
#[serde(crate = "serde")]
struct UrlTestFail {
failure: bool,
}

#[derive(Debug, serde::Deserialize)]
#[serde(crate = "serde")]
struct SetterTest {
href: String,
new_value: String,
expected: SetterTestExpected,
}

#[derive(Debug, serde::Deserialize)]
#[serde(crate = "serde")]
struct SetterTestExpected {
href: Option<String>,
protocol: Option<String>,
Expand Down

0 comments on commit 0d78e8a

Please sign in to comment.