diff --git a/Cargo.lock b/Cargo.lock index be04a4d..d6fd969 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,21 +38,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anes" version = "0.1.6" @@ -250,21 +235,11 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "bitflags_serde_shim" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df031780c32b0f93cecaf883fa9e351e74679e24380c534aeef94556cfd80ac9" -dependencies = [ - "serde", -] - [[package]] name = "blah-types" version = "0.0.0" dependencies = [ "bitflags", - "bitflags_serde_shim", "criterion", "ed25519-dalek", "expect-test", @@ -277,7 +252,6 @@ dependencies = [ "serde", "serde_jcs", "serde_json", - "serde_with", "sha2", "thiserror", "url", @@ -399,19 +373,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets", -] - [[package]] name = "ciborium" version = "0.2.2" @@ -620,41 +581,6 @@ dependencies = [ "syn", ] -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn", -] - [[package]] name = "data-encoding" version = "2.6.0" @@ -672,16 +598,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - [[package]] name = "digest" version = "0.10.7" @@ -922,7 +838,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -939,12 +855,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -1130,35 +1040,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.5.0" @@ -1169,17 +1050,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.6.0" @@ -1188,7 +1058,6 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", - "serde", ] [[package]] @@ -1372,12 +1241,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-traits" version = "0.2.19" @@ -1597,12 +1460,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2109,36 +1966,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.6.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sha1" version = "0.10.6" @@ -2250,7 +2077,7 @@ dependencies = [ "bitflags", "cc", "fallible-iterator", - "indexmap 2.6.0", + "indexmap", "log", "memchr", "phf", @@ -2361,37 +2188,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -2530,7 +2326,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -2886,15 +2682,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-registry" version = "0.2.0" diff --git a/blah-types/Cargo.toml b/blah-types/Cargo.toml index 146cb1d..b420d3c 100644 --- a/blah-types/Cargo.toml +++ b/blah-types/Cargo.toml @@ -4,9 +4,11 @@ version = "0.0.0" edition = "2021" [features] -default = [] -unsafe_use_mock_instant_for_testing = ["dep:mock_instant"] +default = ["ed25519-dalek/default"] schemars = ["dep:schemars"] +rusqlite = ["dep:rusqlite"] + +unsafe_use_mock_instant_for_testing = ["dep:mock_instant"] [[bench]] name = "crypto_ops" @@ -14,25 +16,29 @@ harness = false [dependencies] bitflags = "2" -bitflags_serde_shim = "0.2" -ed25519-dalek = "2" +ed25519-dalek = { version = "2", default-features = false } hex = { version = "0.4", features = ["serde"] } html-escape = "0.2" -mock_instant = { version = "0.5", optional = true } rand = "0.8" -rusqlite = { version = "0.32", optional = true } serde = { version = "1", features = ["derive"] } serde_jcs = "0.1" serde_json = "1" -serde_with = "3" thiserror = "1" url = { version = "2", features = ["serde"] } +[dependencies.rusqlite] +version = "0.32" +optional = true + [dependencies.schemars] version = "0.8" optional = true features = ["url"] +[dependencies.mock_instant] +version = "0.5" +optional = true + [dev-dependencies] criterion = "0.5" ed25519-dalek = { version = "2", features = ["rand_core"] } diff --git a/blah-types/src/lib.rs b/blah-types/src/lib.rs index aa8e3f7..1c66e52 100644 --- a/blah-types/src/lib.rs +++ b/blah-types/src/lib.rs @@ -14,7 +14,7 @@ macro_rules! impl_json_schema_as { // Workaround: https://github.com/GREsau/schemars/issues/267 #[cfg(feature = "schemars")] macro_rules! impl_json_schema_as { - ($ty:ident => $as_ty:ty) => { + ($ty:ty => $as_ty:ty) => { impl schemars::JsonSchema for $ty { fn schema_name() -> String { stringify!($ty).into() diff --git a/blah-types/src/msg.rs b/blah-types/src/msg.rs index edbe8b8..78eddb4 100644 --- a/blah-types/src/msg.rs +++ b/blah-types/src/msg.rs @@ -3,9 +3,7 @@ use std::fmt; use std::num::ParseIntError; use std::str::FromStr; -use bitflags_serde_shim::impl_serde_for_bitflags; use serde::{de, ser, Deserialize, Serialize}; -use serde_with::{serde_as, DisplayFromStr}; use url::Url; use crate::identity::IdUrl; @@ -13,13 +11,26 @@ use crate::{PubKey, Signed}; /// An opaque server-specific ID for rooms, messages, and etc. /// It's currently serialized as a string for JavaScript's convenience. -#[serde_as] -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -#[serde(transparent)] -pub struct Id(#[serde_as(as = "DisplayFromStr")] pub i64); +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Id(pub i64); impl_json_schema_as!(Id => String); +impl Serialize for Id { + fn serialize(&self, ser: S) -> Result { + // TODO: No alloc? + self.0.to_string().serialize(ser) + } +} + +impl<'de> Deserialize<'de> for Id { + fn deserialize>(de: D) -> Result { + let s = <&str>::deserialize(de)?; + s.parse() + .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(s), &"a stringified integer")) + } +} + impl fmt::Display for Id { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.0.fmt(f) @@ -455,13 +466,27 @@ bitflags::bitflags! { } } -impl_serde_for_bitflags!(ServerPermission); -impl_serde_for_bitflags!(MemberPermission); -impl_serde_for_bitflags!(RoomAttrs); +macro_rules! impl_for_bitflags { + ($($ty:ty),* $(,)?) => { + $( + impl Serialize for $ty { + fn serialize(&self, ser: S) -> Result { + self.bits().serialize(ser) + } + } -impl_json_schema_as!(ServerPermission => i32); -impl_json_schema_as!(MemberPermission => i32); -impl_json_schema_as!(RoomAttrs => i32); + impl<'de> Deserialize<'de> for $ty { + fn deserialize>(de: D) -> Result { + <_>::deserialize(de).map(Self::from_bits_retain) + } + } + + impl_json_schema_as!($ty => <$ty as bitflags::Flags>::Bits); + )* + }; +} + +impl_for_bitflags!(ServerPermission, MemberPermission, RoomAttrs); #[cfg(test)] mod tests { diff --git a/blahd/Cargo.toml b/blahd/Cargo.toml index d73b996..038a7da 100644 --- a/blahd/Cargo.toml +++ b/blahd/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [features] default = [] + unsafe_use_mock_instant_for_testing = ["dep:mock_instant", "blah-types/unsafe_use_mock_instant_for_testing"] [dependencies] @@ -18,7 +19,6 @@ futures-util = "0.3" html-escape = "0.2" http-body-util = "0.1" humantime = "2" -mock_instant = { version = "0.5", optional = true } parking_lot = "0.12" # Maybe no better performance, just that we hate poisoning. ¯\_(ツ)_/¯ paste = "1.0.15" rand = "0.8" @@ -43,6 +43,10 @@ url = { version = "2", features = ["serde"] } blah-types = { path = "../blah-types", features = ["rusqlite"] } +[dependencies.mock_instant] +version = "0.5" +optional = true + [build-dependencies] url = "2"