Skip to content

Commit

Permalink
fix: support human-readable uuid in serde. (#76)
Browse files Browse the repository at this point in the history
  • Loading branch information
fky2015 authored Sep 4, 2024
1 parent d9c05a1 commit 5972f7e
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ serde = { version = "1.0.106", features = ["derive"] }
tokio = { version = "1.0.1", features = ["full", "test-util"] }
hyper = { version = "1.1", features = ["server"] }
serde_bytes = "0.11.4"
serde_json = "1"
serde_repr = "0.1.7"
uuid = { version = "1", features = ["v4"] }
uuid = { version = "1", features = ["v4", "serde"] }
time = { version = "0.3.17", features = ["macros", "rand"] }
rand = { version = "0.8.5", features = ["small_rng"] }
18 changes: 14 additions & 4 deletions src/serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ pub mod ipv4 {
#[cfg(feature = "uuid")]
pub mod uuid {
use ::uuid::Uuid;
use serde::de::Error;

use super::*;

Expand All @@ -83,16 +84,25 @@ pub mod uuid {
where
S: Serializer,
{
let bytes = uuid.as_u64_pair();
bytes.serialize(serializer)
if serializer.is_human_readable() {
uuid.to_string().serialize(serializer)
} else {
let bytes = uuid.as_u64_pair();
bytes.serialize(serializer)
}
}

pub fn deserialize<'de, D>(deserializer: D) -> Result<Uuid, D::Error>
where
D: Deserializer<'de>,
{
let bytes: (u64, u64) = Deserialize::deserialize(deserializer)?;
Ok(Uuid::from_u64_pair(bytes.0, bytes.1))
if deserializer.is_human_readable() {
let uuid_str: &str = Deserialize::deserialize(deserializer)?;
Uuid::parse_str(uuid_str).map_err(D::Error::custom)
} else {
let bytes: (u64, u64) = Deserialize::deserialize(deserializer)?;
Ok(Uuid::from_u64_pair(bytes.0, bytes.1))
}
}
}

Expand Down
29 changes: 29 additions & 0 deletions tests/it/uuid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,32 @@ async fn smoke() {
assert_eq!(row, original_row);
assert_eq!(row_uuid_str, original_row.uuid.to_string());
}

#[tokio::test]
async fn human_readable_smoke() {
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Row)]
struct OursRow {
#[serde(with = "clickhouse::serde::uuid")]
uuid: Uuid,
}

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Row)]
struct TheirsRow {
uuid: Uuid,
}

let uuid = Uuid::new_v4();

let row = OursRow { uuid };

let row2 = TheirsRow { uuid };

let s1 = serde_json::to_string(&row).unwrap();
let s2 = serde_json::to_string(&row2).unwrap();

assert_eq!(s1, s2);

let new_row2: TheirsRow = serde_json::from_str(&s2).unwrap();

assert_eq!(new_row2, row2);
}

0 comments on commit 5972f7e

Please sign in to comment.