use std::borrow::Cow;
use serde::{Deserialize as De, Serialize as Ser};
#[cfg(feature = "validation")]
use validator::Validate;
#[cfg(feature = "validation")]
use crate::val_helpr::ValidationResult;
#[derive(Clone, Debug, Hash, PartialEq, Ser, De)]
#[cfg_attr(feature = "validation", derive(Validate))]
pub struct Image<'a> {
image_url: Cow<'a, str>,
alt_text: Cow<'a, str>,
}
impl<'a> Image<'a> {
pub fn builder() -> build::ImageBuilderInit<'a> {
build::ImageBuilderInit::new()
}
#[cfg(feature = "validation")]
#[cfg_attr(docsrs, doc(cfg(feature = "validation")))]
pub fn validate(&self) -> ValidationResult {
Ok(())
}
}
pub mod build {
use std::marker::PhantomData;
use super::*;
use crate::build::*;
#[allow(non_camel_case_types)]
pub mod method {
#[derive(Copy, Clone, Debug)]
pub struct image_url;
#[derive(Copy, Clone, Debug)]
pub struct alt_text;
}
pub type ImageBuilderInit<'a> =
ImageBuilder<'a,
RequiredMethodNotCalled<method::image_url>,
RequiredMethodNotCalled<method::alt_text>>;
#[derive(Debug)]
pub struct ImageBuilder<'a, U, A> {
image_url: Option<Cow<'a, str>>,
alt_text: Option<Cow<'a, str>>,
state: PhantomData<(U, A)>,
}
impl<'a, U, A> ImageBuilder<'a, U, A> {
pub fn new() -> Self {
Self { image_url: None,
alt_text: None,
state: PhantomData::<_> }
}
pub fn image_url<S>(self,
image_url: S)
-> ImageBuilder<'a, Set<method::image_url>, A>
where S: Into<Cow<'a, str>>
{
ImageBuilder { image_url: Some(image_url.into()),
alt_text: self.alt_text,
state: PhantomData::<_> }
}
pub fn src<S>(self,
image_url: S)
-> ImageBuilder<'a, Set<method::image_url>, A>
where S: Into<Cow<'a, str>>
{
self.image_url(image_url)
}
pub fn alt_text<S>(self,
alt_text: S)
-> ImageBuilder<'a, U, Set<method::alt_text>>
where S: Into<Cow<'a, str>>
{
ImageBuilder { image_url: self.image_url,
alt_text: Some(alt_text.into()),
state: PhantomData::<_> }
}
pub fn alt<S>(self,
alt_text: S)
-> ImageBuilder<'a, U, Set<method::alt_text>>
where S: Into<Cow<'a, str>>
{
self.alt_text(alt_text)
}
}
impl<'a> ImageBuilder<'a, Set<method::image_url>, Set<method::alt_text>> {
pub fn build(self) -> Image<'a> {
Image { image_url: self.image_url.unwrap(),
alt_text: self.alt_text.unwrap() }
}
}
}