#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(
feature = "serialization",
derive(serde::Serialize, serde::Deserialize)
)]
pub struct FormField {
pub(super) id: String,
pub(super) label: String,
pub(super) kind: FormFieldKind,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(
feature = "serialization",
derive(serde::Serialize, serde::Deserialize)
)]
pub enum FormFieldKind {
Text,
TextWithPlaceholder(String),
Checkbox,
Select(Vec<String>),
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(
feature = "serialization",
derive(serde::Serialize, serde::Deserialize)
)]
pub enum FormValue {
Text(String),
Bool(bool),
Selected(Option<String>),
}
impl FormField {
pub fn text(id: impl Into<String>, label: impl Into<String>) -> Self {
Self {
id: id.into(),
label: label.into(),
kind: FormFieldKind::Text,
}
}
pub fn text_with_placeholder(
id: impl Into<String>,
label: impl Into<String>,
placeholder: impl Into<String>,
) -> Self {
Self {
id: id.into(),
label: label.into(),
kind: FormFieldKind::TextWithPlaceholder(placeholder.into()),
}
}
pub fn checkbox(id: impl Into<String>, label: impl Into<String>) -> Self {
Self {
id: id.into(),
label: label.into(),
kind: FormFieldKind::Checkbox,
}
}
pub fn select<S: Into<String>>(
id: impl Into<String>,
label: impl Into<String>,
options: Vec<S>,
) -> Self {
Self {
id: id.into(),
label: label.into(),
kind: FormFieldKind::Select(options.into_iter().map(Into::into).collect()),
}
}
pub fn id(&self) -> &str {
&self.id
}
pub fn label(&self) -> &str {
&self.label
}
pub fn kind(&self) -> &FormFieldKind {
&self.kind
}
}