use std::io::Write;
use anyhow::Result;
use derive_builder::Builder;
use html_site_generator_macro::DeriveSetHtmlAttributes;
use super::hyperlink::ReferrerPolicy;
use super::link::CrossOrigin;
use super::{IntoHtmlNode, IsParagraph};
use crate::attributes::HtmlAttributes;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum Loading {
Eager,
Lazy,
}
impl Loading {
fn to_html_string(&self) -> &'static str {
match self {
Loading::Eager => "eager",
Loading::Lazy => "lazy",
}
}
}
#[derive(Debug, Builder, DeriveSetHtmlAttributes)]
pub struct Image {
#[builder(setter(strip_option, into), default)]
alt: Option<String>,
#[builder(setter(strip_option), default)]
cross_origin: Option<CrossOrigin>,
#[builder(setter(strip_option), default)]
height: Option<u32>,
#[builder(setter(strip_option), default = "false")]
ismap: bool,
#[builder(setter(strip_option), default)]
loading: Option<Loading>,
#[builder(setter(strip_option), default)]
referrer_policy: Option<ReferrerPolicy>,
#[builder(setter(strip_option, into), default)]
src: Option<String>,
#[builder(setter(strip_option), default)]
width: Option<u32>,
#[builder(setter(skip))]
_attributes: HtmlAttributes,
}
impl IntoHtmlNode for Image {
fn transform_into_html_node(&self, buffer: &mut dyn Write) -> Result<()> {
write!(buffer, "<img")?;
self._attributes.transform_into_html_node(buffer)?;
if let Some(value) = &self.alt {
write!(buffer, " alt=\"{}\"", value)?;
}
if let Some(value) = &self.cross_origin {
write!(buffer, " crossorigin=\"{}\"", value.to_html_string())?;
}
if let Some(value) = &self.height {
write!(buffer, " height=\"{}\"", value)?;
}
if let Some(value) = &self.loading {
write!(buffer, " loading=\"{}\"", value.to_html_string())?;
}
if let Some(value) = &self.referrer_policy {
write!(buffer, " referrerpolicy=\"{}\"", value.to_html_string())?;
}
if let Some(value) = &self.src {
write!(buffer, " src=\"{}\"", value)?;
}
if let Some(value) = &self.width {
write!(buffer, " width=\"{}\"", value)?;
}
if self.ismap {
write!(buffer, " ismap")?;
}
write!(buffer, ">")?;
Ok(())
}
}
impl IsParagraph for Image {
fn to_raw(&self) -> String {
let mut vec = Vec::new();
self.transform_into_html_node(&mut vec).unwrap();
String::from_utf8(vec).unwrap()
}
}