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),
},
}
}
}