Skip to content

Commit 84c1d8f

Browse files
authored
Merge pull request #8 from mapbox-jp/fix-empty-value
Fix empty value deserialization
2 parents 7b43fbe + 16807fb commit 84c1d8f

File tree

4 files changed

+49
-62
lines changed

4 files changed

+49
-62
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "vast-protocol"
3-
version = "0.2.0"
3+
version = "0.3.0"
44
edition = "2018"
55
description = "VAST protocol v4 parser on top of serde-rs"
66
readme = "README.md"

src/v4.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ pub struct AdTitle(pub String);
7474
pub struct AdSystem {
7575
pub version: String,
7676
#[serde(rename = "$value")]
77-
pub content: String,
77+
pub content: Option<String>,
7878
}
7979

8080
#[derive(Debug, Clone, Serialize, Deserialize)]
8181
#[serde(rename_all = "camelCase")]
8282
pub struct Impression {
8383
pub id: String,
8484
#[serde(rename = "$value")]
85-
pub content: String,
85+
pub content: Option<String>,
8686
}
8787

8888
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -91,7 +91,7 @@ pub struct Pricing {
9191
pub model: String,
9292
pub currency: String,
9393
#[serde(rename = "$value")]
94-
pub content: String,
94+
pub content: Option<String>,
9595
}
9696

9797
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -122,7 +122,7 @@ pub struct UniversalAdId {
122122
pub id_registry: String,
123123
pub id_value: Option<String>,
124124
#[serde(rename = "$value")]
125-
pub content: String,
125+
pub content: Option<String>,
126126
}
127127

128128
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -174,7 +174,7 @@ pub struct Tracking {
174174
pub event: String,
175175
pub offset: Option<String>,
176176
#[serde(rename = "$value")]
177-
pub content: String,
177+
pub content: Option<String>,
178178
}
179179

180180
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -204,7 +204,7 @@ pub struct MediaFile {
204204
pub codec: Option<String>,
205205
pub api_framework: Option<String>,
206206
#[serde(rename = "$value")]
207-
pub content: String,
207+
pub content: Option<String>,
208208
}
209209

210210
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -223,15 +223,15 @@ pub struct VideoClicks {
223223
pub struct ClickThrough {
224224
pub id: String,
225225
#[serde(rename = "$value")]
226-
pub content: String,
226+
pub content: Option<String>,
227227
}
228228

229229
#[derive(Debug, Clone, Serialize, Deserialize)]
230230
#[serde(rename_all = "camelCase")]
231231
pub struct ClickTracking {
232232
pub id: Option<String>,
233233
#[serde(rename = "$value")]
234-
pub content: String,
234+
pub content: Option<String>,
235235
}
236236

237237
pub mod util {

tests/de.rs

+28-41
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@ fn deserialize_v4() {
77
<Ad id="20001" sequence="1" conditionalAd="false">
88
<InLine>
99
<AdSystem version="4.0">iabtechlab</AdSystem>
10-
<Error>http://example.com/error</Error>
1110
<Impression id="Impression-ID">http://example.com/track/impression</Impression>
12-
<Pricing model="cpm" currency="USD">
13-
<![CDATA[ 25.00 ]]>
14-
</Pricing>
1511
<AdTitle>iabtechlab video ad</AdTitle>
1612
<Creatives>
1713
<Creative id="5480" sequence="1" adId="2447226">
@@ -31,11 +27,6 @@ fn deserialize_v4() {
3127
<![CDATA[https://iab-publicfiles.s3.amazonaws.com/vast/VAST-4.0-Short-Intro.mp4]]>
3228
</MediaFile>
3329
</MediaFiles>
34-
<VideoClicks>
35-
<ClickThrough id="blog">
36-
<![CDATA[https://iabtechlab.com]]>
37-
</ClickThrough>
38-
</VideoClicks>
3930
</Linear>
4031
</Creative>
4132
</Creatives>
@@ -55,26 +46,15 @@ fn deserialize_v4() {
5546
assert_eq!("4.0", in_line.ad_system.version);
5647

5748
// AdSystem tag
58-
assert_eq!("iabtechlab", in_line.ad_system.content);
59-
60-
// Error tag
61-
assert_eq!(
62-
"http://example.com/error",
63-
in_line.error.as_ref().unwrap().0
64-
);
49+
assert_eq!("iabtechlab", in_line.ad_system.content.unwrap());
6550

6651
// Impression tag
6752
assert_eq!("Impression-ID", in_line.impression.id);
6853
assert_eq!(
6954
"http://example.com/track/impression",
70-
in_line.impression.content
55+
in_line.impression.content.unwrap()
7156
);
7257

73-
// Pricing tag
74-
assert_eq!("cpm", in_line.pricing.as_ref().unwrap().model);
75-
assert_eq!("USD", in_line.pricing.as_ref().unwrap().currency);
76-
assert_eq!(" 25.00 ", in_line.pricing.as_ref().unwrap().content);
77-
7858
// Creative tag
7959
let creative = &in_line.creatives.content[0];
8060
assert_eq!("5480", creative.id);
@@ -85,7 +65,7 @@ fn deserialize_v4() {
8565
let universal_ad_id = &creative.universal_ad_ids[0];
8666
assert_eq!("Ad-ID", universal_ad_id.id_registry);
8767
assert_eq!("8465", universal_ad_id.id_value.as_ref().unwrap());
88-
assert_eq!("8465", universal_ad_id.content);
68+
assert_eq!("8465", universal_ad_id.content.as_ref().unwrap());
8969

9070
// Linear tag
9171
let linear = &creative.linear.as_ref().unwrap();
@@ -111,12 +91,30 @@ fn deserialize_v4() {
11191
assert!(event4.offset.is_none());
11292
assert_eq!("00:00:10", event5.offset.as_ref().unwrap());
11393

114-
assert_eq!("http://example.com/tracking/start", event0.content);
115-
assert_eq!("http://example.com/tracking/firstQuartile", event1.content);
116-
assert_eq!("http://example.com/tracking/midpoint", event2.content);
117-
assert_eq!("http://example.com/tracking/thirdQuartile", event3.content);
118-
assert_eq!("http://example.com/tracking/complete", event4.content);
119-
assert_eq!("http://example.com/tracking/progress-10", event5.content);
94+
assert_eq!(
95+
"http://example.com/tracking/start",
96+
event0.content.as_ref().unwrap()
97+
);
98+
assert_eq!(
99+
"http://example.com/tracking/firstQuartile",
100+
event1.content.as_ref().unwrap()
101+
);
102+
assert_eq!(
103+
"http://example.com/tracking/midpoint",
104+
event2.content.as_ref().unwrap()
105+
);
106+
assert_eq!(
107+
"http://example.com/tracking/thirdQuartile",
108+
event3.content.as_ref().unwrap()
109+
);
110+
assert_eq!(
111+
"http://example.com/tracking/complete",
112+
event4.content.as_ref().unwrap()
113+
);
114+
assert_eq!(
115+
"http://example.com/tracking/progress-10",
116+
event5.content.as_ref().unwrap()
117+
);
120118

121119
// Duration tag
122120
assert_eq!("00:00:16", linear.duration.0);
@@ -135,17 +133,6 @@ fn deserialize_v4() {
135133
assert!(media.api_framework.is_none());
136134
assert_eq!(
137135
"https://iab-publicfiles.s3.amazonaws.com/vast/VAST-4.0-Short-Intro.mp4",
138-
media.content
136+
media.content.as_ref().unwrap()
139137
);
140-
141-
// ClickThrough tag
142-
let click_through = &linear
143-
.video_clicks
144-
.as_ref()
145-
.unwrap()
146-
.click_through
147-
.as_ref()
148-
.unwrap();
149-
assert_eq!("blog", click_through.id);
150-
assert_eq!("https://iabtechlab.com", click_through.content);
151138
}

tests/ser.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,20 @@ fn serialize_v4() {
5050
in_line: Some(InLine {
5151
ad_system: AdSystem {
5252
version: "4.0".into(),
53-
content: "iabtechlab".into(),
53+
content: Some("iabtechlab".into()),
5454
},
5555
ad_title: AdTitle("iabtechlab video ad".into()),
5656
advertiser: None,
5757
description: None,
5858
error: Some(Error("http://example.com/error".into())),
5959
impression: Impression {
6060
id: "Impression-ID".into(),
61-
content: "http://example.com/track/impression".into(),
61+
content: Some("http://example.com/track/impression".into()),
6262
},
6363
pricing: Some(Pricing {
6464
model: "cpm".into(),
6565
currency: "USD".into(),
66-
content: " 25.00 ".into(),
66+
content: Some(" 25.00 ".into()),
6767
}),
6868
creatives: Creatives {
6969
content: vec![Creative {
@@ -73,7 +73,7 @@ fn serialize_v4() {
7373
universal_ad_ids: vec![UniversalAdId {
7474
id_registry: "Ad-ID".into(),
7575
id_value: Some("8465".into()),
76-
content: "8465".into(),
76+
content: Some("8465".into()),
7777
}],
7878
non_linear_ads: None,
7979
linear: Some(Linear {
@@ -93,25 +93,25 @@ fn serialize_v4() {
9393
scalable: Some("1".into()),
9494
maintain_aspect_ratio: Some("1".into()),
9595
codec: Some("H.264".into()),
96-
content: "https://iab-publicfiles.s3.amazonaws.com/vast/VAST-4.0-Short-Intro.mp4".into(),
96+
content: Some("https://iab-publicfiles.s3.amazonaws.com/vast/VAST-4.0-Short-Intro.mp4".into()),
9797
api_framework: None,
9898
}
9999
],
100100
},
101101
tracking_events: TrackingEvents {
102102
content: vec![
103-
Tracking { event: "start".into(), offset: None, content:"http://example.com/tracking/start".into() },
104-
Tracking { event: "firstQuartile".into(), offset: None, content: "http://example.com/tracking/firstQuartile".into() },
105-
Tracking { event: "midpoint".into(), offset: None, content: "http://example.com/tracking/midpoint".into() },
106-
Tracking { event: "thirdQuartile".into(), offset: None, content: "http://example.com/tracking/thirdQuartile".into() },
107-
Tracking { event: "complete".into(), offset: None, content: "http://example.com/tracking/complete".into() },
108-
Tracking { event: "progress".into(), offset: Some("00:00:10".into()), content: "http://example.com/tracking/progress-10".into() },
103+
Tracking { event: "start".into(), offset: None, content: Some("http://example.com/tracking/start".into()) },
104+
Tracking { event: "firstQuartile".into(), offset: None, content: Some("http://example.com/tracking/firstQuartile".into()) },
105+
Tracking { event: "midpoint".into(), offset: None, content: Some("http://example.com/tracking/midpoint".into()) },
106+
Tracking { event: "thirdQuartile".into(), offset: None, content: Some("http://example.com/tracking/thirdQuartile".into()) },
107+
Tracking { event: "complete".into(), offset: None, content: Some("http://example.com/tracking/complete".into()) },
108+
Tracking { event: "progress".into(), offset: Some("00:00:10".into()), content: Some("http://example.com/tracking/progress-10".into()) },
109109
]
110110
},
111111
video_clicks: Some(VideoClicks {
112112
click_through: Some(ClickThrough {
113113
id: "blog".into(),
114-
content: "https://iabtechlab.com".into(),
114+
content: Some("https://iabtechlab.com".into()),
115115
}),
116116
click_tracking: None,
117117
})

0 commit comments

Comments
 (0)