Skip to content

Commit 8d83eb0

Browse files
committed
Serialize/deserializer HeaderName as string
This is much more convenient, and is also required to implement Object Store object headers, since they are serialized to JSON.
1 parent b1ba88f commit 8d83eb0

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

async-nats/src/header.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ macro_rules! standard_headers {
397397
)+
398398
) => {
399399
#[allow(clippy::enum_variant_names)]
400-
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
400+
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
401401
enum StandardHeader {
402402
$(
403403
$variant,
@@ -481,7 +481,7 @@ standard_headers! {
481481
(NatsExpectedStream, NATS_EXPECTED_STREAM, b"Nats-Expected-Stream");
482482
}
483483

484-
#[derive(Debug, Hash, PartialEq, Eq, Clone, Serialize, Deserialize)]
484+
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
485485
struct CustomHeader {
486486
bytes: Bytes,
487487
}
@@ -518,7 +518,7 @@ impl<'a> From<&'a str> for CustomHeader {
518518
}
519519
}
520520

521-
#[derive(Debug, Hash, PartialEq, Eq, Clone, Serialize, Deserialize)]
521+
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
522522
enum HeaderRepr {
523523
Standard(StandardHeader),
524524
Custom(CustomHeader),
@@ -533,7 +533,7 @@ enum HeaderRepr {
533533
///
534534
/// `HeaderName` represents standard header names using an `enum`, as such they
535535
/// will not require an allocation for storage.
536-
#[derive(Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
536+
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
537537
pub struct HeaderName {
538538
inner: HeaderRepr,
539539
}
@@ -600,6 +600,26 @@ impl AsRef<str> for HeaderName {
600600
}
601601
}
602602

603+
impl Serialize for HeaderName {
604+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
605+
where
606+
S: serde::Serializer,
607+
{
608+
serializer.serialize_str(self.as_str())
609+
}
610+
}
611+
612+
impl<'de> Deserialize<'de> for HeaderName {
613+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
614+
where
615+
D: serde::Deserializer<'de>,
616+
{
617+
String::deserialize(deserializer)?
618+
.parse()
619+
.map_err(|e| serde::de::Error::custom(e))
620+
}
621+
}
622+
603623
#[derive(Debug, Clone)]
604624
pub struct ParseHeaderNameError;
605625

@@ -760,4 +780,15 @@ mod tests {
760780

761781
assert_eq!(a, b);
762782
}
783+
784+
#[test]
785+
fn header_name_serde() {
786+
let raw = "Nats-Stream";
787+
let raw_json = "\"Nats-Stream\"";
788+
let header = HeaderName::from_static(raw);
789+
790+
// ser/de of HeaderName should be the same as raw string
791+
assert_eq!(serde_json::to_string(&header).unwrap(), raw_json);
792+
assert_eq!(serde_json::from_str::<HeaderName>(raw_json).unwrap(), header);
793+
}
763794
}

0 commit comments

Comments
 (0)