opengraph_rs/
object.rs

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    // No Vetical
67    #[serde(rename = "article")]
68    Article,
69    #[serde(rename = "book")]
70    Book,
71    #[serde(rename = "profile")]
72    Profile,
73    #[serde(rename = "website")]
74    Website,
75    // Music
76    #[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    // Video
85    #[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}