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}