From 8921d72c3b23cf6048f97b279842bf7ed44539f4 Mon Sep 17 00:00:00 2001 From: Doyin Awosanya Date: Fri, 1 Aug 2025 15:15:19 +0100 Subject: [PATCH 1/5] adding serde feature & traits to scylla types --- scylla-cql/Cargo.toml | 1 + scylla-cql/src/value.rs | 53 +++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/scylla-cql/Cargo.toml b/scylla-cql/Cargo.toml index 8dde7c41a5..50ce3a56a9 100644 --- a/scylla-cql/Cargo.toml +++ b/scylla-cql/Cargo.toml @@ -76,6 +76,7 @@ harness = false [features] secrecy-08 = ["dep:secrecy-08"] +serde = ["dep:serde", "uuid/serde"] time-03 = ["dep:time-03"] chrono-04 = [] num-bigint-03 = ["dep:num-bigint-03"] diff --git a/scylla-cql/src/value.rs b/scylla-cql/src/value.rs index 83f86d5385..9fef292081 100644 --- a/scylla-cql/src/value.rs +++ b/scylla-cql/src/value.rs @@ -6,6 +6,8 @@ use std::result::Result as StdResult; use thiserror::Error; use uuid::Uuid; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::deserialize::value::DeserializeValue; use crate::deserialize::value::{ @@ -33,6 +35,7 @@ pub struct ValueOverflow; pub struct Unset; /// Represents an counter value +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct Counter(pub i64); @@ -61,6 +64,7 @@ impl MaybeUnset { /// /// This type has custom comparison logic which follows ScyllaDB/Cassandra semantics. /// For details, see [`Ord` implementation](#impl-Ord-for-CqlTimeuuid). +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq)] pub struct CqlTimeuuid(Uuid); @@ -277,6 +281,7 @@ impl std::hash::Hash for CqlTimeuuid { /// /// The implementation of [`PartialEq`], however, normalizes the underlying bytes /// before comparison. For details, check [examples](#impl-PartialEq-for-CqlVarint). +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, Debug)] pub struct CqlVarint(Vec); @@ -284,6 +289,7 @@ pub struct CqlVarint(Vec); /// /// Refer to the documentation of [`CqlVarint`]. /// Especially, see the disclaimer about [non-normalized values](CqlVarint#db-data-format). +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, Debug)] pub struct CqlVarintBorrowed<'b>(&'b [u8]); @@ -511,6 +517,7 @@ impl From> for num_bigint_04::BigInt { /// Notice that [constructors](CqlDecimal#impl-CqlDecimal) /// don't perform any normalization on the provided data. /// For more details, see [`CqlVarint`] documentation. +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Clone, PartialEq, Eq, Debug)] pub struct CqlDecimal { int_val: CqlVarint, @@ -525,8 +532,10 @@ pub struct CqlDecimal { /// /// Refer to the documentation of [`CqlDecimal`]. /// Especially, see the disclaimer about [non-normalized values](CqlDecimal#db-data-format). +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq, Debug)] pub struct CqlDecimalBorrowed<'b> { + #[cfg_attr(feature = "serde", serde(borrow))] int_val: CqlVarintBorrowed<'b>, scale: i32, } @@ -632,18 +641,21 @@ impl TryFrom for CqlDecimal { /// Native CQL date representation that allows for a bigger range of dates (-262145-1-1 to 262143-12-31). /// /// Represented as number of days since -5877641-06-23 i.e. 2^31 days before unix epoch. +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct CqlDate(pub u32); /// Native CQL timestamp representation that allows full supported timestamp range. /// /// Represented as signed milliseconds since unix epoch. +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct CqlTimestamp(pub i64); /// Native CQL time representation. /// /// Represented as nanoseconds since midnight. +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct CqlTime(pub i64); @@ -852,6 +864,7 @@ impl TryInto for CqlTime { } /// Represents a CQL Duration value +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, Copy, PartialEq, Eq)] pub struct CqlDuration { /// Number of months. @@ -1355,83 +1368,83 @@ pub fn deser_cql_value( Ok(match typ { Native(Ascii) => { - let s = String::deserialize(typ, v)?; + let s = DeserializeValue::deserialize(typ, v)?; CqlValue::Ascii(s) } Native(Boolean) => { - let b = bool::deserialize(typ, v)?; + let b = DeserializeValue::deserialize(typ, v)?; CqlValue::Boolean(b) } Native(Blob) => { - let b = Vec::::deserialize(typ, v)?; + let b = DeserializeValue::deserialize(typ, v)?; CqlValue::Blob(b) } Native(Date) => { - let d = CqlDate::deserialize(typ, v)?; + let d = DeserializeValue::deserialize(typ, v)?; CqlValue::Date(d) } Native(Counter) => { - let c = crate::value::Counter::deserialize(typ, v)?; + let c = DeserializeValue::deserialize(typ, v)?; CqlValue::Counter(c) } Native(Decimal) => { - let d = CqlDecimal::deserialize(typ, v)?; + let d = DeserializeValue::deserialize(typ, v)?; CqlValue::Decimal(d) } Native(Double) => { - let d = f64::deserialize(typ, v)?; + let d = DeserializeValue::deserialize(typ, v)?; CqlValue::Double(d) } Native(Float) => { - let f = f32::deserialize(typ, v)?; + let f = DeserializeValue::deserialize(typ, v)?; CqlValue::Float(f) } Native(Int) => { - let i = i32::deserialize(typ, v)?; + let i = DeserializeValue::deserialize(typ, v)?; CqlValue::Int(i) } Native(SmallInt) => { - let si = i16::deserialize(typ, v)?; + let si = DeserializeValue::deserialize(typ, v)?; CqlValue::SmallInt(si) } Native(TinyInt) => { - let ti = i8::deserialize(typ, v)?; + let ti = DeserializeValue::deserialize(typ, v)?; CqlValue::TinyInt(ti) } Native(BigInt) => { - let bi = i64::deserialize(typ, v)?; + let bi = DeserializeValue::deserialize(typ, v)?; CqlValue::BigInt(bi) } Native(Text) => { - let s = String::deserialize(typ, v)?; + let s = DeserializeValue::deserialize(typ, v)?; CqlValue::Text(s) } Native(Timestamp) => { - let t = CqlTimestamp::deserialize(typ, v)?; + let t = DeserializeValue::deserialize(typ, v)?; CqlValue::Timestamp(t) } Native(Time) => { - let t = CqlTime::deserialize(typ, v)?; + let t = DeserializeValue::deserialize(typ, v)?; CqlValue::Time(t) } Native(Timeuuid) => { - let t = CqlTimeuuid::deserialize(typ, v)?; + let t = DeserializeValue::deserialize(typ, v)?; CqlValue::Timeuuid(t) } Native(Duration) => { - let d = CqlDuration::deserialize(typ, v)?; + let d = DeserializeValue::deserialize(typ, v)?; CqlValue::Duration(d) } Native(Inet) => { - let i = IpAddr::deserialize(typ, v)?; + let i = DeserializeValue::deserialize(typ, v)?; CqlValue::Inet(i) } Native(Uuid) => { - let uuid = uuid::Uuid::deserialize(typ, v)?; + let uuid = DeserializeValue::deserialize(typ, v)?; CqlValue::Uuid(uuid) } Native(Varint) => { - let vi = CqlVarint::deserialize(typ, v)?; + let vi = DeserializeValue::deserialize(typ, v)?; CqlValue::Varint(vi) } Collection { From 233cb01c8f6d3975c3f45c893ac9e1961c00016a Mon Sep 17 00:00:00 2001 From: Doyin Awosanya Date: Fri, 1 Aug 2025 15:39:51 +0100 Subject: [PATCH 2/5] added serde feature to scylla crate --- scylla/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/scylla/Cargo.toml b/scylla/Cargo.toml index 15bfb0b138..68040dc6cd 100644 --- a/scylla/Cargo.toml +++ b/scylla/Cargo.toml @@ -18,6 +18,7 @@ rustdoc-args = ["--cfg", "docsrs"] default = [] openssl-010 = ["dep:tokio-openssl", "dep:openssl"] rustls-023 = ["dep:tokio-rustls", "dep:rustls"] +serde = ["scylla-cql/serde"] unstable-cloud = [ "scylla-cql/serde", "dep:serde_yaml", From b63b67c7fc7a2bc17df0d27049bf2a1cc8106382 Mon Sep 17 00:00:00 2001 From: Doyin Awosanya Date: Sat, 2 Aug 2025 07:53:47 +0100 Subject: [PATCH 3/5] removed redundant path in derive --- scylla-cql/src/value.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scylla-cql/src/value.rs b/scylla-cql/src/value.rs index 9fef292081..c727f51525 100644 --- a/scylla-cql/src/value.rs +++ b/scylla-cql/src/value.rs @@ -35,7 +35,7 @@ pub struct ValueOverflow; pub struct Unset; /// Represents an counter value -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct Counter(pub i64); @@ -517,7 +517,7 @@ impl From> for num_bigint_04::BigInt { /// Notice that [constructors](CqlDecimal#impl-CqlDecimal) /// don't perform any normalization on the provided data. /// For more details, see [`CqlVarint`] documentation. -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq, Debug)] pub struct CqlDecimal { int_val: CqlVarint, From 7f59896a2a5a8b26057b468c4e7d3976ccd2d85d Mon Sep 17 00:00:00 2001 From: Doyin Awosanya Date: Sat, 2 Aug 2025 08:52:58 +0100 Subject: [PATCH 4/5] formatted code --- scylla-cql/src/value.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scylla-cql/src/value.rs b/scylla-cql/src/value.rs index c727f51525..801fa5d16d 100644 --- a/scylla-cql/src/value.rs +++ b/scylla-cql/src/value.rs @@ -4,10 +4,10 @@ use std::net::IpAddr; use std::result::Result as StdResult; -use thiserror::Error; -use uuid::Uuid; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +use thiserror::Error; +use uuid::Uuid; use crate::deserialize::value::DeserializeValue; use crate::deserialize::value::{ From 2b7c6366f3fb2da6a820e0fc2461f44bcbfc73be Mon Sep 17 00:00:00 2001 From: Doyin Awosanya Date: Sun, 3 Aug 2025 12:51:34 +0100 Subject: [PATCH 5/5] Updated Cargo.lock.msrv --- Cargo.lock.msrv | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock.msrv b/Cargo.lock.msrv index bf4237a2ff..98a1f126af 100644 --- a/Cargo.lock.msrv +++ b/Cargo.lock.msrv @@ -2285,6 +2285,7 @@ checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "atomic", "getrandom 0.2.15", + "serde", ] [[package]]