1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
use serde::{Deserialize, Serialize};
use std::default::Default;

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct Embed {
    /// Title of the embed
    pub title: Option<String>,
    #[serde(rename = "type")]
    pub kind: Option<String>,
    pub description: Option<String>,
    pub url: Option<String>,
    pub timestamp: Option<String>,
    pub color: Option<u64>, // TODO: COLOR ENUM
    pub footer: Option<EmbedFooter>,
    pub image: Option<EmbedImage>,
    pub thumbnail: Option<EmbedThumbnail>,
    pub video: Option<EmbedVideo>,
    pub provider: Option<EmbedProvider>,
    pub author: Option<EmbedAuthor>,
    pub fields: Vec<EmbedField>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedFooter {
    text: String,
    icon_url: Option<String>,
    proxy_icon_url: Option<String>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedImage {
    url: Option<String>,
    proxy_url: Option<String>,
    height: Option<u64>,
    width: Option<u64>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedThumbnail {
    url: Option<String>,
    proxy_url: Option<String>,
    height: Option<u64>,
    width: Option<u64>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedVideo {
    url: Option<String>,
    height: Option<u64>,
    width: Option<u64>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedProvider {
    name: Option<String>,
    url: Option<String>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedAuthor {
    name: Option<String>,
    url: Option<String>,
    icon_url: Option<String>,
    proxy_icon_url: Option<String>,
}

#[derive(Default, Debug, Deserialize, Serialize)]
pub struct EmbedField {
    name: String,
    value: String,
    inline: bool,
}

impl Embed {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn set_title(&mut self, title: impl Into<String>) -> &mut Self {
        self.title = Some(title.into());

        self
    }

    pub fn set_description(&mut self, description: impl Into<String>) -> &mut Self {
        self.description = Some(description.into());

        self
    }

    pub fn set_url(&mut self, url: impl Into<String>) -> &mut Self {
        self.url = Some(url.into());

        self
    }

    pub fn set_color(&mut self, _color: u64) -> &mut Self {
        unimplemented!();
    }

    pub fn add_footer(&mut self, footer: EmbedFooter) -> &mut Self {
        self.footer = Some(footer);

        self
    }

    pub fn add_image(&mut self, image: EmbedImage) -> &mut Self {
        self.image = Some(image);

        self
    }

    pub fn add_thumbnail(&mut self, thumbnail: EmbedThumbnail) -> &mut Self {
        self.thumbnail = Some(thumbnail);

        self
    }

    pub fn add_video(&mut self, video: EmbedVideo) -> &mut Self {
        self.video = Some(video);

        self
    }

    pub fn set_provider(&mut self, provider: EmbedProvider) -> &mut Self {
        self.provider = Some(provider);

        self
    }

    pub fn set_author(&mut self, author: EmbedAuthor) -> &mut Self {
        self.author = Some(author);

        self
    }

    pub fn add_field(&mut self, name: impl Into<String>, value: impl Into<String>, inline: bool) -> &mut Self {
        let field = EmbedField {
            name: name.into(),
            value: value.into(),
            inline,
        };
        self.fields.push(field);

        self
    }
}