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::*;
use crate::{compose::Confirm, text};
#[derive(Clone, Debug, Hash, PartialEq, Ser, De)]
#[cfg_attr(feature = "validation", derive(Validate))]
pub struct DatePicker<'a> {
#[cfg_attr(feature = "validation", validate(length(max = 255)))]
action_id: Cow<'a, str>,
#[cfg_attr(feature = "validation",
validate(custom = "validate_placeholder"))]
#[serde(skip_serializing_if = "Option::is_none")]
placeholder: Option<text::Text>,
#[serde(skip_serializing_if = "Option::is_none")]
initial_date: Option<String>,
#[cfg_attr(feature = "validation", validate)]
#[serde(skip_serializing_if = "Option::is_none")]
confirm: Option<Confirm>,
}
#[cfg(feature = "validation")]
fn validate_placeholder(p: &text::Text) -> ValidatorResult {
below_len("DatePicker.placeholder", 150, p)
}
impl<'a> DatePicker<'a> {
pub fn builder() -> build::DatePickerBuilderInit<'a> {
build::DatePickerBuilderInit::new()
}
#[cfg(feature = "validation")]
#[cfg_attr(docsrs, doc(cfg(feature = "validation")))]
pub fn validate(&self) -> ValidationResult {
Validate::validate(self)
}
}
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 action_id;
}
pub type DatePickerBuilderInit<'a> =
DatePickerBuilder<'a, RequiredMethodNotCalled<method::action_id>>;
#[derive(Debug)]
pub struct DatePickerBuilder<'a, A> {
action_id: Option<Cow<'a, str>>,
placeholder: Option<text::Text>,
initial_date: Option<String>,
confirm: Option<Confirm>,
state: PhantomData<A>,
}
impl<'a, A> DatePickerBuilder<'a, A> {
pub fn new() -> Self {
Self { action_id: None,
placeholder: None,
initial_date: None,
confirm: None,
state: PhantomData::<_> }
}
pub fn action_id<S>(self,
action_id: S)
-> DatePickerBuilder<'a, Set<method::action_id>>
where S: Into<Cow<'a, str>>
{
DatePickerBuilder { action_id: Some(action_id.into()),
placeholder: self.placeholder,
initial_date: self.initial_date,
confirm: self.confirm,
state: PhantomData::<_> }
}
pub fn placeholder<S>(mut self, placeholder: S) -> Self
where S: Into<text::Plain>
{
self.placeholder = Some(placeholder.into().into());
self
}
pub fn initial_date(mut self, (day, month, year): (u8, u8, u16)) -> Self {
self.initial_date = Some(format!("{:02}-{:02}-{}", year, month, day));
self
}
pub fn confirm(mut self, confirm: Confirm) -> Self {
self.confirm = Some(confirm);
self
}
}
impl<'a> DatePickerBuilder<'a, Set<method::action_id>> {
pub fn build(self) -> DatePicker<'a> {
DatePicker { action_id: self.action_id.unwrap(),
placeholder: self.placeholder,
initial_date: self.initial_date,
confirm: self.confirm }
}
}
}