Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,25 @@ proc-macro = true
all-features = true

[features]
secret = ["dep:secrecy"]
serde = [
"dep:serde",
"secrecy?/serde",
"ulid?/serde",
"url?/serde",
"uuid?/serde",
]
ulid = ["dep:ulid"]
url = ["dep:url"]
uuid = ["dep:uuid"]
# These features only control which macros this crate exports. They never change
# the code that an existing macro generates, so enabling one anywhere in the
# dependency graph cannot affect another crate that shares this instance.
secret = []
ulid = []
url = []
uuid = []

[dependencies]
proc-macro2 = ">=1.0.63, <2"
quote = ">=1.0.28, <2"
secrecy = { version = ">=0.10.3, <0.11", optional = true }
serde = { version = ">=1.0.184, <2", features = ["derive"], optional = true }
syn = { version = ">=2.0.31, <3", features = ["extra-traits"] }
ulid = { version = ">=1.1.3, <2", optional = true }
url = { version = ">=2.2.2, <3", optional = true }
uuid = { version = ">=1.1.2, <2", optional = true }

# The tests consume this crate the way any other crate does, so they declare the
# same dependencies a consumer declares. None of these are needed by the macros.
[dev-dependencies]
secrecy = { version = "0.10.3", features = ["serde"] }
serde = { version = "1.0.184", features = ["derive"] }
serde_json = "1.0.85"
ulid = { version = "1.1.3", features = ["serde"] }
url = { version = "2.2.2", features = ["serde"] }
uuid = { version = "1.1.2", features = ["serde"] }
4 changes: 4 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ pre-commit:
build-docs:
cargo doc --all-features --no-deps

# Check that no feature leaks into a crate that did not enable it
check-feature-unification:
cargo check --workspace --all-features

# Check that all Cargo features compile
check-features:
cargo hack --feature-powerset check --lib --tests
Expand Down
18 changes: 1 addition & 17 deletions src/name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,23 +72,7 @@ pub fn name_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,23 +93,7 @@ pub fn number_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,23 +76,7 @@ pub fn path_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/secret.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,23 +78,7 @@ pub fn secret_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize)]
#[derive(Clone, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/ulid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,23 +81,7 @@ pub fn ulid_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/url.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,23 +81,7 @@ pub fn url_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
18 changes: 1 addition & 17 deletions src/uuid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,23 +81,7 @@ pub fn uuid_impl(input: TokenStream) -> TokenStream {
}

fn derives() -> proc_macro2::TokenStream {
let mut derives = quote! {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
};

derives.extend(derive_serde());

derives
}

#[cfg(feature = "serde")]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {
#[derive(serde::Deserialize, serde::Serialize)]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
}
}

#[cfg(not(feature = "serde"))]
fn derive_serde() -> proc_macro2::TokenStream {
quote! {}
}
3 changes: 1 addition & 2 deletions tests/name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ use typed_fields::name;

name!(
/// A doc comment for the test name
#[derive(serde::Deserialize, serde::Serialize)]
TestName
);

#[cfg(feature = "serde")]
#[test]
fn deserialize_returns_name() {
let json = r#""test""#;
Expand Down Expand Up @@ -60,7 +60,6 @@ fn implements_unpin() {
assert_unpin::<TestName>();
}

#[cfg(feature = "serde")]
#[test]
fn serialize_returns_json() {
let name = TestName::new("test");
Expand Down
3 changes: 1 addition & 2 deletions tests/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use typed_fields::number;

number!(
/// A doc comment for the test id
#[derive(serde::Deserialize, serde::Serialize)]
TestId
);

Expand All @@ -13,7 +14,6 @@ number!(
TestU64, u64
);

#[cfg(feature = "serde")]
#[test]
fn deserialize_returns_number() {
let json = "42";
Expand Down Expand Up @@ -66,7 +66,6 @@ fn implements_unpin() {
assert_unpin::<TestId>();
}

#[cfg(feature = "serde")]
#[test]
fn serialize_returns_json() {
let id = TestId::new(42);
Expand Down
3 changes: 1 addition & 2 deletions tests/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ use typed_fields::path;

path!(
/// A doc comment for the test path
#[derive(serde::Deserialize, serde::Serialize)]
TestPath
);

#[cfg(feature = "serde")]
#[test]
fn deserialize_returns_path() {
let json = r#""test""#;
Expand Down Expand Up @@ -62,7 +62,6 @@ fn implements_unpin() {
assert_unpin::<TestPath>();
}

#[cfg(feature = "serde")]
#[test]
fn serialize_returns_json() {
let name: TestPath = "test".into();
Expand Down
21 changes: 11 additions & 10 deletions tests/secret.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
// TODO: Debug this warning, fix its cause, and remove this directive.
#![allow(non_local_definitions)]

#[cfg(all(feature = "secret", feature = "serde"))]
#[cfg(feature = "secret")]
use typed_fields::secret;

#[cfg(feature = "secret")]
secret!(
/// A doc comment for the test secret
#[derive(serde::Deserialize)]
TestSecret
);

#[cfg(feature = "secret")]
#[test]
fn deserialize_returns_secret() {
let json = r#""test""#;
Expand All @@ -19,15 +29,6 @@ fn display_returns_redacted_value() {
assert_eq!("[REDACTED]", secret.to_string());
}

#[cfg(feature = "secret")]
use typed_fields::secret;

#[cfg(feature = "secret")]
secret!(
/// A doc comment for the test secret
TestSecret
);

#[cfg(feature = "secret")]
#[test]
fn expose_returns_secret() {
Expand Down
33 changes: 18 additions & 15 deletions tests/ulid.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
// TODO: Debug this warning, fix its cause, and remove this directive.
#![allow(non_local_definitions)]

#[cfg(all(feature = "serde", feature = "ulid"))]
#[cfg(feature = "ulid")]
use std::convert::TryInto;

#[cfg(feature = "ulid")]
use typed_fields::ulid;

#[cfg(feature = "ulid")]
use ulid::Ulid;

#[cfg(feature = "ulid")]
ulid!(
/// A doc comment for the test ULID
#[derive(serde::Deserialize, serde::Serialize)]
TestUlid
);

#[cfg(feature = "ulid")]
#[test]
fn deserialize_returns_ulid() {
let json = r#""01ARZ3NDEKTSV4RRFFQ69G5FAV""#;
Expand All @@ -19,19 +35,6 @@ fn display_returns_inner_value() {
assert_eq!("01ARZ3NDEKTSV4RRFFQ69G5FAV", ulid.to_string());
}

#[cfg(feature = "ulid")]
use std::convert::TryInto;
#[cfg(feature = "ulid")]
use typed_fields::ulid;
#[cfg(feature = "ulid")]
use ulid::Ulid;

#[cfg(feature = "ulid")]
ulid!(
/// A doc comment for the test ULID
TestUlid
);

#[cfg(feature = "ulid")]
#[test]
fn get_returns_inner_value() {
Expand Down Expand Up @@ -63,7 +66,7 @@ fn implements_unpin() {
assert_unpin::<TestUlid>();
}

#[cfg(all(feature = "serde", feature = "ulid"))]
#[cfg(feature = "ulid")]
#[test]
fn serialize_returns_json() {
let ulid = TestUlid::new(Ulid::from_string("01ARZ3NDEKTSV4RRFFQ69G5FAV").unwrap());
Expand Down
Loading
Loading