use std::io::Write;
use anyhow::Result;
use derive_builder::Builder;
use crate::html::hyperlink::ReferrerPolicy;
use crate::html::IntoHtmlNode;
#[derive(Debug, Clone)]
pub enum CrossOrigin {
Anonymous,
UseCredentials,
}
impl CrossOrigin {
pub(crate) fn to_html_string(&self) -> &'static str {
match self {
CrossOrigin::Anonymous => "anonymous",
CrossOrigin::UseCredentials => "use-credentials",
}
}
}
#[derive(Debug, Clone, Default)]
pub enum Relationship {
Alternate,
Author,
DnsPrefetch,
Help,
Icon,
License,
Next,
Pingback,
Preconnect,
Prefetch,
Preload,
Prerender,
Prev,
Search,
#[default]
Stylesheet,
}
impl Relationship {
fn to_html_string(&self) -> &'static str {
match self {
Relationship::Alternate => "alternate",
Relationship::Author => "author",
Relationship::DnsPrefetch => "dns-prefetch",
Relationship::Help => "help",
Relationship::Icon => "icon",
Relationship::License => "license",
Relationship::Next => "next",
Relationship::Pingback => "pingback",
Relationship::Preconnect => "preconnect",
Relationship::Prefetch => "prefetch",
Relationship::Preload => "preload",
Relationship::Prerender => "prerender",
Relationship::Prev => "prev",
Relationship::Search => "search",
Relationship::Stylesheet => "stylesheet",
}
}
}
#[derive(Debug, Default, Builder)]
pub struct Link {
#[builder(setter(strip_option), default)]
crossorigin: Option<CrossOrigin>,
#[builder(setter(strip_option, into), default)]
href: Option<String>,
#[builder(setter(strip_option, into), default)]
href_lang: Option<String>,
#[builder(setter(strip_option, into), default)]
media: Option<String>,
#[builder(setter(strip_option), default)]
referrer_policy: Option<ReferrerPolicy>,
rel: Relationship,
#[builder(setter(strip_option, into), default)]
sizes: Option<String>,
#[builder(setter(strip_option, into), default)]
title: Option<String>,
#[builder(setter(strip_option, into), default)]
media_type: Option<String>,
}
impl IntoHtmlNode for Link {
fn transform_into_html_node(&self, buffer: &mut dyn Write) -> Result<()> {
write!(buffer, "<link")?;
if let Some(value) = &self.crossorigin {
write!(buffer, " crossorigin=\"{}\"", value.to_html_string())?;
}
if let Some(value) = &self.href {
write!(buffer, " href=\"{}\"", value)?;
}
if let Some(value) = &self.href_lang {
write!(buffer, " hreflang=\"{}\"", value)?;
}
if let Some(value) = &self.media {
write!(buffer, " media=\"{}\"", value)?;
}
if let Some(value) = &self.referrer_policy {
write!(buffer, " referrerpolicy=\"{}\"", value.to_html_string())?;
}
write!(buffer, " rel=\"{}\"", self.rel.to_html_string())?;
if let Some(value) = &self.sizes {
write!(buffer, " sizes=\"{}\"", value)?;
}
if let Some(value) = &self.title {
write!(buffer, " title=\"{}\"", value)?;
}
if let Some(value) = &self.title {
write!(buffer, " title=\"{}\"", value)?;
}
if let Some(value) = &self.media_type {
write!(buffer, " type=\"{}\"", value)?;
}
writeln!(buffer, ">")?;
Ok(())
}
}