Skip to content

Commit bcb8363

Browse files
Fix null context attributes in json (#142)
* Fix null extensions and fields in json Signed-off-by: Francesco Guardiani <[email protected]> * fmt Signed-off-by: Francesco Guardiani <[email protected]>
1 parent 589db8e commit bcb8363

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

src/event/data.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ impl From<String> for Data {
3636
}
3737
}
3838

39+
impl From<&str> for Data {
40+
fn from(value: &str) -> Self {
41+
Data::String(String::from(value))
42+
}
43+
}
44+
3945
impl TryFrom<Data> for serde_json::Value {
4046
type Error = serde_json::Error;
4147

src/event/format.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ macro_rules! parse_field {
2323
macro_rules! extract_optional_field {
2424
($map:ident, $name:literal, $target_type:ty, $error:ty) => {
2525
$map.remove($name)
26+
.filter(|v| !v.is_null())
2627
.map(|v| parse_field!(v, $target_type, $error))
2728
.transpose()
2829
};
2930

3031
($map:ident, $name:literal, $target_type:ty, $error:ty, $mapper:expr) => {
3132
$map.remove($name)
33+
.filter(|v| !v.is_null())
3234
.map(|v| parse_field!(v, $target_type, $error, $mapper))
3335
.transpose()
3436
};
@@ -93,6 +95,7 @@ pub(crate) trait EventFormatDeserializer {
9395
)?;
9496
let extensions = map
9597
.into_iter()
98+
.filter(|v| !v.1.is_null())
9699
.map(|(k, v)| {
97100
Ok((
98101
k,

tests/serde_json.rs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use claim::*;
2-
use cloudevents::Event;
2+
use cloudevents::{Event, EventBuilder, EventBuilderV10};
33
use rstest::rstest;
4-
use serde_json::Value;
4+
use serde_json::{json, Value};
55

66
mod test_data;
77
use test_data::*;
@@ -87,3 +87,65 @@ fn deserialize_should_succeed(in_json: Value, out_event: Event) {
8787
let deserialize_json = deserialize_result.unwrap();
8888
assert_eq!(deserialize_json, out_event)
8989
}
90+
91+
#[test]
92+
fn deserialize_with_null_attribute() {
93+
let in_json = json!({
94+
"specversion" : "1.0",
95+
"type" : "com.example.someevent",
96+
"source" : "/mycontext",
97+
"id" : "A234-1234-1234",
98+
"time" : null,
99+
"comexampleextension1" : "value",
100+
"comexampleothervalue" : 5,
101+
"datacontenttype" : "text/xml",
102+
"data" : "<much wow=\"xml\"/>"
103+
});
104+
105+
let out_event = EventBuilderV10::new()
106+
.ty("com.example.someevent")
107+
.source("/mycontext")
108+
.id("A234-1234-1234")
109+
.data("text/xml", "<much wow=\"xml\"/>")
110+
.extension("comexampleextension1", "value")
111+
.extension("comexampleothervalue", 5)
112+
.build()
113+
.unwrap();
114+
115+
let deserialize_result: Result<Event, serde_json::Error> = serde_json::from_value(in_json);
116+
assert_ok!(&deserialize_result);
117+
let deserialize_json = deserialize_result.unwrap();
118+
assert_eq!(deserialize_json, out_event)
119+
}
120+
121+
#[test]
122+
fn deserialize_with_null_ext() {
123+
let in_json = json!({
124+
"specversion" : "1.0",
125+
"type" : "com.example.someevent",
126+
"source" : "/mycontext",
127+
"id" : "A234-1234-1234",
128+
"time" : "2018-04-05T17:31:00Z",
129+
"comexampleextension1" : "value",
130+
"comexampleothervalue" : 5,
131+
"unsetextension": null,
132+
"datacontenttype" : "text/xml",
133+
"data" : "<much wow=\"xml\"/>"
134+
});
135+
136+
let out_event = EventBuilderV10::new()
137+
.ty("com.example.someevent")
138+
.source("/mycontext")
139+
.id("A234-1234-1234")
140+
.time("2018-04-05T17:31:00Z")
141+
.data("text/xml", "<much wow=\"xml\"/>")
142+
.extension("comexampleextension1", "value")
143+
.extension("comexampleothervalue", 5)
144+
.build()
145+
.unwrap();
146+
147+
let deserialize_result: Result<Event, serde_json::Error> = serde_json::from_value(in_json);
148+
assert_ok!(&deserialize_result);
149+
let deserialize_json = deserialize_result.unwrap();
150+
assert_eq!(deserialize_json, out_event)
151+
}

0 commit comments

Comments
 (0)