openrtb_native1/request/
asset_value.rs

1/// 4.3 [`Title`], 4.4 [`Image`], 4.5 [`Video`], 4.6 [`Data`]
2///
3/// [`Title`]: ./struct.Title.html
4/// [`Image`]: ./struct.Image.html
5/// [`Video`]: ./struct.Video.html
6/// [`Data`]: ./struct.Data.html
7#[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
8#[serde(rename_all = "snake_case")]
9pub enum AssetValue {
10    /// recommended; object; -
11    /// Title object for title assets. See TitleObject definition.
12    Title(crate::request::Title),
13    /// recommended; object; -
14    /// Image object for image assets. See ImageObject definition.
15    Img(crate::request::Image),
16    /// optional1; object; -
17    /// Video object for video assets. See the Video request object definition. Note that in-stream
18    /// (ie preroll, etc) video ads are not part of Native. Native ads may contain a video as the
19    /// ad creative itself.
20    Video(crate::request::Video),
21    /// recommended; object; -
22    /// Data object for brand name, description, ratings, prices etc. See DataObject definition.
23    Data(crate::request::Data),
24}
25
26impl AssetValue {
27    pub fn is_title(&self) -> bool {
28        self.as_title().is_some()
29    }
30
31    pub fn as_title(&self) -> Option<&crate::request::Title> {
32        match self {
33            Self::Title(title) => Some(title),
34            _ => None,
35        }
36    }
37
38    pub fn as_title_mut(&mut self) -> Option<&mut crate::request::Title> {
39        match self {
40            Self::Title(ref mut title) => Some(title),
41            _ => None,
42        }
43    }
44
45    pub fn is_image(&self) -> bool {
46        self.as_image().is_some()
47    }
48
49    pub fn as_image(&self) -> Option<&crate::request::Image> {
50        match self {
51            Self::Img(image) => Some(image),
52            _ => None,
53        }
54    }
55
56    pub fn as_image_mut(&mut self) -> Option<&mut crate::request::Image> {
57        match self {
58            Self::Img(ref mut image) => Some(image),
59            _ => None,
60        }
61    }
62
63    pub fn is_video(&self) -> bool {
64        self.as_video().is_some()
65    }
66
67    pub fn as_video(&self) -> Option<&crate::request::Video> {
68        match self {
69            Self::Video(video) => Some(video),
70            _ => None,
71        }
72    }
73
74    pub fn as_video_mut(&mut self) -> Option<&mut crate::request::Video> {
75        match self {
76            Self::Video(ref mut video) => Some(video),
77            _ => None,
78        }
79    }
80
81    pub fn is_data(&self) -> bool {
82        self.as_data().is_some()
83    }
84
85    pub fn as_data(&self) -> Option<&crate::request::Data> {
86        match self {
87            Self::Data(data) => Some(data),
88            _ => None,
89        }
90    }
91
92    pub fn as_data_mut(&mut self) -> Option<&mut crate::request::Data> {
93        match self {
94            Self::Data(ref mut data) => Some(data),
95            _ => None,
96        }
97    }
98}
99
100#[cfg(test)]
101mod test {
102    use super::*;
103
104    #[test]
105    fn json() -> serde_json::Result<()> {
106        let json = r#"{"title":{"len":0}}"#;
107        let o1 = AssetValue::Title(Default::default());
108        assert_eq!(serde_json::to_string(&o1)?, json);
109        assert_eq!(o1, serde_json::from_str::<AssetValue>(json)?);
110
111        Ok(())
112    }
113}