1use video::Video;
2use image::Image;
3use audio::Audio;
4
5#[derive(Serialize, Deserialize, Debug, Default, Clone)]
6pub struct Object {
7 #[serde(rename = "type")]
8 pub obj_type: ObjectType,
9 pub title: String,
10 pub url: String,
11
12 pub images: Vec<Image>,
13 pub audios: Vec<Audio>,
14 pub videos: Vec<Video>,
15
16 pub description: Option<String>,
17 pub determiner: Option<Determiner>,
18 pub locale: Option<String>,
19 pub locale_alternate: Vec<String>,
20 pub site_name: Option<String>,
21}
22
23impl Object {
24 pub fn new<'a>(props: &'a Vec<(String, String)>) -> Object {
25 let mut obj = Object::default();
26 for prop in props.iter() {
27 let key: &str = &(prop.0);
28 let v = prop.1.clone();
29 match key {
30 "title" => { obj.title = v; },
31 "type" => { obj.obj_type = ObjectType::new(v); },
32 "url" => { obj.url = v; },
33 "description" => { obj.description = Some(v); },
34 "determiner" => { obj.determiner = Some(Determiner::new(v)); },
35 "locale" => { obj.locale = Some(v); },
36 "site_name" => { obj.site_name = Some(v); },
37
38 "image" => { obj.images.push(Image::new(v)); },
39 "video" => { obj.videos.push(Video::new(v)); },
40 "audio" => { obj.audios.push(Audio::new(v)); },
41 "locale:alternate" => {
42 obj.locale_alternate.push(v)
43 },
44 v if v.starts_with("image") => {
45 },
46 v if v.starts_with("music") => {
47 },
48
49 v if v.starts_with("video") => {
50 },
51 v if v.starts_with("article") => {
52 },
53 v if v.starts_with("book") => {
54 },
55 v if v.starts_with("profile") => {
56 },
57 _ => {},
58 }
59 }
60 obj
61 }
62}
63
64#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
65pub enum ObjectType {
66 #[serde(rename = "article")]
68 Article,
69 #[serde(rename = "book")]
70 Book,
71 #[serde(rename = "profile")]
72 Profile,
73 #[serde(rename = "website")]
74 Website,
75 #[serde(rename = "music.song")]
77 Song,
78 #[serde(rename = "music.album")]
79 Album,
80 #[serde(rename = "music.playlist")]
81 Playlist,
82 #[serde(rename = "music.radio_station")]
83 RadioStation,
84 #[serde(rename = "video.movie")]
86 Movie,
87 #[serde(rename = "video.episode")]
88 Episode,
89 #[serde(rename = "video.tv_show")]
90 TVShow,
91 #[serde(rename = "video.other")]
92 VideoOther,
93}
94
95impl ObjectType {
96 pub fn new(str: String) -> ObjectType {
97 match str.as_ref() {
98 "article" => ObjectType::Article,
99 "book" => ObjectType::Book,
100 "profile" => ObjectType::Profile,
101 "website" => ObjectType::Website,
102 "music.song" => ObjectType::Song,
103 "music.album" => ObjectType::Album,
104 "music.playlist" => ObjectType::Playlist,
105 "music.radio_station" => ObjectType::RadioStation,
106 "video.movie" => ObjectType::Movie,
107 "video.episode" => ObjectType::Episode,
108 "video.tv_show" => ObjectType::TVShow,
109 "video.other" => ObjectType::VideoOther,
110 _ => ObjectType::Website,
111 }
112 }
113}
114
115impl Default for ObjectType {
116 fn default() -> ObjectType { ObjectType::Website }
117}
118
119#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
120pub enum Determiner {
121 #[serde(rename = "a")]
122 A,
123 #[serde(rename = "an")]
124 An,
125 #[serde(rename = "the")]
126 The,
127 #[serde(rename = "")]
128 Blank,
129 #[serde(rename = "auto")]
130 Auto,
131}
132
133impl Determiner {
134 pub fn new(str: String) -> Determiner {
135 match str.as_ref() {
136 "a" => Determiner::A,
137 "an" => Determiner::An,
138 "the" => Determiner::The,
139 "auto" => Determiner::Auto,
140 _ => Determiner::Blank,
141 }
142 }
143}
144
145impl Default for Determiner {
146 fn default() -> Determiner { Determiner::Blank }
147}