lints.workspace = true

[package]
authors = [
    "Jonas Bushart",
    # For creation of the SerializeAs and DeserializeAs traits.
    "Marcin Kaźmierczak",
]
name = "serde_with"

categories = ["encoding", "no-std", "no-std::no-alloc"]
description = "Custom de/serialization functions for Rust's serde"
documentation = "https://docs.rs/serde_with/"
keywords = ["serde", "utilities", "serialization", "deserialization"]

edition.workspace = true
license.workspace = true
readme.workspace = true
repository.workspace = true
rust-version.workspace = true
version.workspace = true

include = ["src/**/*", "tests/**/*", "LICENSE-*", "README.md", "CHANGELOG.md"]

[badges]
maintenance = {status = "actively-developed"}

# When adding new features update the documentation in feature-flags.md
# The features are documented using https://docs.rs/document-features
# lib.rs has support for generating the documentation from the feature flags.
#   https://users.rust-lang.org/t/new-features-on-lib-rs/98560
[features]
default = ["std", "macros"]

#! `serde_with` is fully `no_std` compatible, by depending on it with `default-features = false`.
#! Support for `alloc` and `std` can be enabled with the respective features.
#! Some features require `alloc` or `std` support and might not work in a `no_std` environment.

## Enable support for types from the `alloc` crate when running in a `no_std` environment.
alloc = ["serde/alloc", "base64?/alloc", "chrono_0_4?/alloc", "hex?/alloc", "serde_json?/alloc", "time_0_3?/alloc"]
## Enables support for various types from the std library.
## This will enable `std` support in all dependencies too.
## The feature enabled by default and also enables `alloc`.
std = ["alloc", "serde/std", "chrono_0_4?/clock", "chrono_0_4?/std", "indexmap_1?/std", "indexmap_2?/std", "time_0_3?/serde-well-known", "time_0_3?/std"]

#! # Documentation
#!
#! The following features enhance the documentation of `serde_with`.

## The `guide` feature enables inclusion of this user guide.
## The feature only changes the rustdoc output and enables no other effects.
guide = ["dep:doc-comment", "dep:document-features", "macros", "std"]

#! # Features
#!
#! The following features enable support for types from other crates or enable additional functionality that requires further dependencies to be pulled in.
#! These features are disabled by default to minimize the number of required dependencies.

## The feature enables serializing data in base64 format.
base64 = ["dep:base64", "alloc"]
## Deprecated feature name. Use `chrono_0_4` instead.
chrono = ["chrono_0_4"]
## The feature enables integration of `chrono` v0.4 specific conversions.
## This includes support for the timestamp and duration types.
## More features are available in combination with `alloc` or `std`.
## The legacy feature name `chrono` is still available for v1 compatibility.
##
## This pulls in `chrono` v0.4 as a dependency.
chrono_0_4 = ["dep:chrono_0_4"]
## The feature enables `hashbrown::{HashMap, HashSet}` as supported containers.
##
## This pulls in `hashbrown` v0.14 as a dependency.
## It enables the `alloc` feature.
## Some functionality is only available when `std` is enabled too.
hashbrown_0_14 = ["dep:hashbrown_0_14", "alloc"]
## The feature enables `hashbrown::{HashMap, HashSet}` as supported containers.
##
## This pulls in `hashbrown` v0.15 as a dependency.
## It enables the `alloc` feature.
## Some functionality is only available when `std` is enabled too.
hashbrown_0_15 = ["dep:hashbrown_0_15", "alloc"]
## The feature enables serializing data in hex format.
##
## This pulls in `hex` as a dependency.
## It enables the `alloc` feature.
hex = ["dep:hex", "alloc"]
## Deprecated feature name. Use `indexmap_1` instead.
indexmap = ["indexmap_1"]
## The feature enables implementations of `indexmap` v1 specific checks.
## This includes support for checking duplicate keys and duplicate values.
## The legacy feature name `indexmap` is still available for v1 compatibility.
##
## This pulls in `indexmap` v1 as a dependency.
## It enables the `alloc` feature.
## Some functionality is only available when `std` is enabled too.
indexmap_1 = ["dep:indexmap_1", "alloc"]
## The feature enables implementations of `indexmap` v2 specific checks.
## This includes support for checking duplicate keys and duplicate values.
##
## This pulls in `indexmap` v2 as a dependency.
## It enables the `alloc` feature.
## Some functionality is only available when `std` is enabled too.
indexmap_2 = ["dep:indexmap_2", "alloc"]
## The feature enables JSON conversions from the `json` module.
##
## This pulls in `serde_json` as a dependency.
## It enables the `alloc` feature.
json = ["dep:serde_json", "alloc"]
## The feature enables all helper macros and derives.
## It is enabled by default, since the macros provide a usability benefit, especially for `serde_as`.
##
## This pulls in `serde_with_macros` as a dependency.
macros = ["dep:serde_with_macros"]
## This feature enables integration with `schemars` 0.8.
## This makes `#[derive(JsonSchema)]` pick up the correct schema for the type
## used within `#[serde_as(as = ...)]`.
##
## This pulls in `schemars` v0.8 as a dependency. It will also implicitly enable
## the `std` feature as `schemars` is not `#[no_std]`.
schemars_0_8 = ["dep:schemars_0_8", "std", "serde_with_macros?/schemars_0_8"]
## The feature enables integration of `time` v0.3 specific conversions.
## This includes support for the timestamp and duration types.
##
## This pulls in `time` v0.3 as a dependency.
## Some functionality is only available when `alloc` or `std` is enabled too.
time_0_3 = ["dep:time_0_3"]

# When adding new optional dependencies, update the documentation in feature-flags.md
[dependencies]
base64 = {version = "0.22.1", optional = true, default-features = false}
chrono_0_4 = {package = "chrono", version = "0.4.20", optional = true, default-features = false, features = ["serde"]}
doc-comment = {version = "0.3.3", optional = true}
document-features = {version = "0.2.7", optional = true}
hashbrown_0_14 = {package = "hashbrown", version = "0.14.0", optional = true, default-features = false, features = ["serde"]}
hashbrown_0_15 = {package = "hashbrown", version = "0.15.0", optional = true, default-features = false, features = ["serde"]}
hex = {version = "0.4.3", optional = true, default-features = false}
indexmap_1 = {package = "indexmap", version = "1.8", optional = true, default-features = false, features = ["serde-1"]}
indexmap_2 = {package = "indexmap", version = "2.0", optional = true, default-features = false, features = ["serde"]}
schemars_0_8 = {package = "schemars", version = "0.8.16", optional = true, default-features = false}
serde = {version = "1.0.152", default-features = false}
serde_derive = "1.0.152"
serde_json = {version = "1.0.45", optional = true, default-features = false}
serde_with_macros = {path = "../serde_with_macros", version = "=3.11.0", optional = true}
time_0_3 = {package = "time", version = "~0.3.36", optional = true, default-features = false}

[dev-dependencies]
expect-test = "1.5.0"
fnv = "1.0.6"
glob = "0.3.0"
jsonschema = { version = "0.18.0", default-features = false, features = ["resolve-file"] }
mime = "0.3.16"
pretty_assertions = "1.4.0"
regex = {version = "1.11.0", default-features = false, features = ["std"]}
rmp-serde = "1.3.0"
ron = "0.8"
rustversion = "1.0.0"
schemars_0_8 = {package = "schemars", version = "0.8.16"}
serde = {version = "1.0.152", default-features = false, features = ["derive"]}
serde_json = {version = "1.0.25", features = ["preserve_order"]}
serde_test = "1.0.124"
serde_yaml = "0.9.2"
serde-xml-rs = "0.6.0"
version-sync = "0.9.1"

[[test]]
name = "base64"
path = "tests/base64.rs"
required-features = ["base64", "macros"]

[[test]]
name = "chrono_0_4"
path = "tests/chrono_0_4.rs"
required-features = ["chrono_0_4", "macros"]

[[test]]
name = "hex"
path = "tests/hex.rs"
required-features = ["hex", "macros"]

[[test]]
name = "hashbrown_0_14"
path = "tests/hashbrown_0_14.rs"
required-features = ["hashbrown_0_14", "macros"]

[[test]]
name = "hashbrown_0_15"
path = "tests/hashbrown_0_15.rs"
required-features = ["hashbrown_0_15", "macros"]

[[test]]
name = "indexmap_1"
path = "tests/indexmap_1.rs"
required-features = ["indexmap_1", "macros"]

[[test]]
name = "indexmap_2"
path = "tests/indexmap_2.rs"
required-features = ["indexmap_2", "macros"]

[[test]]
name = "json"
path = "tests/json.rs"
required-features = ["json", "macros"]

[[test]]
name = "serde_as"
path = "tests/serde_as/lib.rs"
required-features = ["macros"]

[[test]]
name = "time_0_3"
path = "tests/time_0_3.rs"
required-features = ["macros", "time_0_3"]

[[test]]
name = "derives"
path = "tests/derives/lib.rs"
required-features = ["macros"]

[[test]]
name = "with_prefix"
path = "tests/with_prefix.rs"
required-features = ["macros"]

[[test]]
name = "rust"
path = "tests/rust.rs"
required-features = ["alloc"]

[[test]]
name = "schemars_0_8"
path = "tests/schemars_0_8.rs"
required-features = ["schemars_0_8"]

[package.metadata.docs.rs]
all-features = true
rustdoc-args = [
    # Enable doc_cfg showing the required features.
    "--cfg=docsrs",
    # Generate links to definition in rustdoc source code pages
    # https://github.com/rust-lang/rust/pull/84176
    "-Zunstable-options", "--generate-link-to-definition"
]

[package.metadata.release]
pre-release-replacements = [
    {file = "CHANGELOG.md", search = "\\[Unreleased\\]", replace = "[Unreleased]\n\n## [{{version}}] - {{date}}"},
    {file = "src/lib.rs", search = "https://docs\\.rs/serde_with/[\\d.]+/", replace = "https://docs.rs/serde_with/{{version}}/"},
    {file = "README.md", search = "https://docs\\.rs/serde_with/[\\d.]+/", replace = "https://docs.rs/serde_with/{{version}}/"},
]
tag = true
tag-message = "{{crate_name}} v{{version}}"
tag-name = "v{{version}}"