openrtb_native1/request/asset.rs
1/// 4.2 Asset Request Object
2///
3/// The main container object for each asset requested or supported by Exchange on behalf of the
4/// rendering client. Any object that is required is to be flagged as such. Only one of the
5/// {title,img,video,data} objects should be present in each object. All others should be
6/// null/absent. The id is to be unique within the AssetObject array so that the response can be
7/// aligned.
8///
9/// To be more explicit, it is the ID of each asset object that maps the response to the request. So
10/// if a request for a title object is sent with id 1, then the response containing the title should
11/// have an id of 1.
12///
13/// Since version 1.1 of the spec, there are recommended sizes/lengths/etc with some of the asset
14/// types. The goal for asset requirements standardization is to facilitate adoption of native by
15/// DSPs by limiting the diverse types/sizes/requirements of assets they must have available to
16/// purchase a native ad impression. While great diversity may exist in publishers, advertisers/DSPs
17/// can not be expected to provide infinite headline lengths, thumbnail aspect ratios, etc. While we
18/// have not gone as far as creating a single standard, we've honed in on a few options that cover
19/// the most common cases. SSPs can deviate from these standards, but should understand they may
20/// limit applicable DSP demand by doing so. DSPs should feel confident that if they support these
21/// standards they'll be able to access most native inventory.
22#[derive(serde::Serialize, serde::Deserialize, Default, Debug, PartialEq, Clone)]
23pub struct Asset {
24 /// required; integer; -
25 /// Unique asset ID, assigned by exchange. Typically a counter for the array.
26 pub id: i32,
27
28 /// optional; integer; 0
29 /// Set to 1 if asset is required. (exchange will not accept a bid without it)
30 #[serde(
31 default,
32 skip_serializing_if = "default_ext::DefaultExt::is_default",
33 with = "crate::serde::i32_as_bool"
34 )]
35 pub required: bool,
36
37 // recommended; object; -
38 #[serde(flatten, default, skip_serializing_if = "Option::is_none")]
39 pub value: Option<crate::request::AssetValue>,
40
41 /// optional; object; -
42 /// This object is a placeholder that may contain custom JSON agreed to by the parties to
43 /// support flexibility beyond the standard defined in this specification.
44 #[serde(default, skip_serializing_if = "Option::is_none")]
45 pub ext: Option<serde_json::Map<String, serde_json::Value>>,
46}
47
48#[cfg(test)]
49mod test {
50 use super::*;
51
52 #[test]
53 fn json() -> serde_json::Result<()> {
54 let json = r#"{"id":0}"#;
55 let o1 = Asset::default();
56 assert_eq!(serde_json::to_string(&o1)?, json);
57 assert_eq!(o1, serde_json::from_str::<Asset>(json)?);
58
59 Ok(())
60 }
61}