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::{opt::{AnyText, NoUrl},
Confirm,
Opt},
text};
type MyOpt<'a> = Opt<'a, AnyText, NoUrl>;
#[cfg(feature = "validation")]
fn validate_options<'a>(o: &Cow<'a, [MyOpt<'a>]>) -> ValidatorResult {
below_len("options", 10, o.as_ref())
}
#[cfg(feature = "validation")]
fn validate_initial_options<'a>(o: &Cow<'a, [MyOpt<'a>]>) -> ValidatorResult {
below_len("initial_options", 10, o.as_ref())
}
#[derive(Clone, Debug, Hash, PartialEq, Ser, De)]
#[cfg_attr(feature = "validation", derive(Validate))]
pub struct Checkboxes<'a> {
#[cfg_attr(feature = "validation", validate(length(max = 255)))]
action_id: Cow<'a, str>,
#[cfg_attr(feature = "validation", validate(custom = "validate_options"))]
options: Cow<'a, [MyOpt<'a>]>,
#[cfg_attr(feature = "validation",
validate(custom = "validate_initial_options"))]
#[serde(skip_serializing_if = "Option::is_none")]
initial_options: Option<Cow<'a, [MyOpt<'a>]>>,
#[cfg_attr(feature = "validation", validate)]
#[serde(skip_serializing_if = "Option::is_none")]
confirm: Option<Confirm>,
}
impl<'a> Checkboxes<'a> {
pub fn builder() -> build::CheckboxesBuilderInit<'a> {
build::CheckboxesBuilderInit::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;
#[derive(Copy, Clone, Debug)]
pub struct options;
}
pub type CheckboxesBuilderInit<'a> =
CheckboxesBuilder<'a,
RequiredMethodNotCalled<method::action_id>,
RequiredMethodNotCalled<method::options>>;
#[derive(Debug)]
pub struct CheckboxesBuilder<'a, A, O> {
action_id: Option<Cow<'a, str>>,
options: Option<Vec<MyOpt<'a>>>,
initial_options: Option<Vec<MyOpt<'a>>>,
confirm: Option<Confirm>,
state: PhantomData<(A, O)>,
}
impl<'a, A, O> CheckboxesBuilder<'a, A, O> {
pub fn new() -> Self {
Self { action_id: None,
options: None,
initial_options: None,
confirm: None,
state: PhantomData::<_> }
}
pub fn action_id<S>(self,
action_id: S)
-> CheckboxesBuilder<'a, Set<method::action_id>, O>
where S: Into<Cow<'a, str>>
{
CheckboxesBuilder { action_id: Some(action_id.into()),
options: self.options,
initial_options: self.initial_options,
confirm: self.confirm,
state: PhantomData::<_> }
}
#[cfg(feature = "blox")]
#[cfg_attr(docsrs, doc(cfg(feature = "blox")))]
pub fn child<T: Into<text::Text>>(
self,
option: Opt<'a, T, NoUrl>)
-> CheckboxesBuilder<'a, A, Set<method::options>> {
self.option(option)
}
pub fn options<T: Into<text::Text>>(
self,
options: Vec<Opt<'a, T, NoUrl>>)
-> CheckboxesBuilder<'a, A, Set<method::options>> {
CheckboxesBuilder { action_id: self.action_id,
options: Some(options.into_iter()
.map(|o| o.into())
.collect()),
initial_options: self.initial_options,
confirm: self.confirm,
state: PhantomData::<_> }
}
pub fn option<T: Into<text::Text>>(
self,
option: Opt<'a, T, NoUrl>)
-> CheckboxesBuilder<'a, A, Set<method::options>> {
let options = match self.options {
| Some(mut options) => {
options.push(option.into());
options
},
| None => vec![option.into()],
};
CheckboxesBuilder { action_id: self.action_id,
options: Some(options),
initial_options: self.initial_options,
confirm: self.confirm,
state: PhantomData::<_> }
}
pub fn initial_options<T: Into<text::Text>>(mut self,
options: Vec<Opt<'a,
T,
NoUrl>>)
-> Self {
self.initial_options =
Some(options.into_iter().map(|o| o.into()).collect());
self
}
pub fn confirm(mut self, confirm: Confirm) -> Self {
self.confirm = Some(confirm);
self
}
}
impl<'a> CheckboxesBuilder<'a, Set<method::action_id>, Set<method::options>> {
pub fn build(self) -> Checkboxes<'a> {
Checkboxes { action_id: self.action_id.unwrap(),
options: self.options.unwrap().into(),
initial_options: self.initial_options.map(|os| os.into()),
confirm: self.confirm }
}
}
}