From f26895a9a504995a43d7d902225854cf8499c7d0 Mon Sep 17 00:00:00 2001 From: Gerd Zellweger Date: Fri, 1 Dec 2023 11:08:21 -0800 Subject: [PATCH] Expose rkyv features as features for chrono users. rkyv by default serializes usize as u32. This isn't ideal on most modern platforms and unfortunately is configured through a feature flag. If we just set `default-features = false` in the rkyv Cargo dependency, the crate fails to compile because all the size features are mutually exclusive. On the other hand if we want to e.g., change the serialization of usize to 64-bit and we also want to use chrono this currently fails to compile because chrono always enables rkyv/size_32. This re-exports the relevant rkyv features so users can choose which serialization to enable. The approach is similar to what the ordered-float crate does: https://github.com/reem/rust-ordered-float/blob/8111b345372632893af0b8aa12152f3dc7278aba/Cargo.toml#L37 Signed-off-by: Gerd Zellweger --- Cargo.toml | 10 ++++++++-- src/month.rs | 2 +- src/naive/isoweek.rs | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e056373386..a56c0c000f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ rust-version = "1.61.0" name = "chrono" [features] +# Don't forget to adjust `ALL_NON_EXCLUSIVE_FEATURES` in CI scripts when adding a feature or an optional dependency. default = ["clock", "std", "oldtime", "wasmbind"] alloc = [] libc = [] @@ -27,7 +28,12 @@ now = ["std"] oldtime = [] wasmbind = ["wasm-bindgen", "js-sys"] unstable-locales = ["pure-rust-locales"] -rkyv-validation = ["rkyv/validation"] +# Note that rkyv-16, rkyv-32, and rkyv-64 are mutually exclusive. +rkyv-16 = ["rkyv", "rkyv?/size_16"] +rkyv-32 = ["rkyv", "rkyv?/size_32"] +rkyv-64 = ["rkyv", "rkyv?/size_64"] +rkyv-validation = ["rkyv?/validation"] +# Features for internal use only: __internal_bench = [] [dependencies] @@ -35,7 +41,7 @@ num-traits = { version = "0.2", default-features = false } rustc-serialize = { version = "0.3.20", optional = true } serde = { version = "1.0.99", default-features = false, optional = true } pure-rust-locales = { version = "0.7", optional = true } -rkyv = { version = "0.7.41", optional = true } +rkyv = { version = "0.7.43", optional = true, default-features = false } arbitrary = { version = "1.0.0", features = ["derive"], optional = true } [target.'cfg(all(target_arch = "wasm32", not(any(target_os = "emscripten", target_os = "wasi"))))'.dependencies] diff --git a/src/month.rs b/src/month.rs index 26597bd4b0..2f18f9a10b 100644 --- a/src/month.rs +++ b/src/month.rs @@ -33,7 +33,7 @@ use crate::OutOfRange; #[cfg_attr(feature = "rkyv", derive(Archive, Deserialize, Serialize))] #[cfg_attr( feature = "rkyv", - archive(compare(PartialEq)), + archive(compare(PartialEq, PartialOrd)), archive_attr(derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)) )] #[cfg_attr(feature = "rkyv-validation", archive(check_bytes))] diff --git a/src/naive/isoweek.rs b/src/naive/isoweek.rs index 50ffcdc169..8ef982701e 100644 --- a/src/naive/isoweek.rs +++ b/src/naive/isoweek.rs @@ -20,7 +20,7 @@ use rkyv::{Archive, Deserialize, Serialize}; #[cfg_attr(feature = "rkyv", derive(Archive, Deserialize, Serialize))] #[cfg_attr( feature = "rkyv", - archive(compare(PartialEq)), + archive(compare(PartialEq, PartialOrd)), archive_attr(derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)) )] #[cfg_attr(feature = "rkyv-validation", archive(check_bytes))]