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
use super::clone::string_to_owned;
use std::borrow::Cow;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "kebab-case", tag = "embed", content = "data")]
pub enum Embed<'t> {
#[serde(rename_all = "kebab-case")]
Youtube { video_id: Cow<'t, str> },
#[serde(rename_all = "kebab-case")]
Vimeo { video_id: Cow<'t, str> },
GithubGist {
username: Cow<'t, str>,
hash: Cow<'t, str>,
},
#[serde(rename_all = "kebab-case")]
GitlabSnippet { snippet_id: Cow<'t, str> },
}
impl Embed<'_> {
pub fn name(&self) -> &'static str {
match self {
Embed::Youtube { .. } => "YouTube",
Embed::Vimeo { .. } => "Vimeo",
Embed::GithubGist { .. } => "GithubGist",
Embed::GitlabSnippet { .. } => "GitlabSnippet",
}
}
pub fn direct_url(&self) -> String {
match self {
Embed::Youtube { video_id } => format!("https://youtu.be/{video_id}"),
Embed::Vimeo { video_id } => format!("https://vimeo.com/{video_id}"),
Embed::GithubGist { username, hash } => {
format!("https://gist.github.com/{username}/{hash}")
}
Embed::GitlabSnippet { snippet_id } => {
format!("https://gitlab.com/-/snippets/{snippet_id}")
}
}
}
pub fn to_owned(&self) -> Embed<'static> {
match self {
Embed::Youtube { video_id } => Embed::Youtube {
video_id: string_to_owned(video_id),
},
Embed::Vimeo { video_id } => Embed::Vimeo {
video_id: string_to_owned(video_id),
},
Embed::GithubGist { username, hash } => Embed::GithubGist {
username: string_to_owned(username),
hash: string_to_owned(hash),
},
Embed::GitlabSnippet { snippet_id } => Embed::GitlabSnippet {
snippet_id: string_to_owned(snippet_id),
},
}
}
}