use serde::{Deserialize, Serialize};
use crate::node::{ActionId, Common, IntoNode, Key, Node};
use crate::text::Line;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SelectOption {
pub value: String,
pub label: Line,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
impl SelectOption {
#[must_use]
pub fn new(value: impl Into<String>, label: impl Into<Line>) -> Self {
Self {
value: value.into(),
label: label.into(),
description: None,
}
}
#[must_use]
pub fn description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
}
impl From<(&str, &str)> for SelectOption {
fn from((value, label): (&str, &str)) -> Self {
Self::new(value, label)
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Select {
#[serde(flatten)]
pub common: Common,
pub options: Vec<SelectOption>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_change: Option<ActionId>,
}
impl Select {
#[must_use]
pub fn new(
key: impl Into<Key>,
options: impl IntoIterator<Item = impl Into<SelectOption>>,
) -> Self {
let mut common = Common::new();
common.key = Some(key.into());
Self {
common,
options: options.into_iter().map(Into::into).collect(),
value: None,
placeholder: None,
disabled: None,
on_change: None,
}
}
#[must_use]
pub fn value(mut self, value: impl Into<String>) -> Self {
self.value = Some(value.into());
self
}
#[must_use]
pub fn placeholder(mut self, placeholder: impl Into<String>) -> Self {
self.placeholder = Some(placeholder.into());
self
}
#[must_use]
pub fn disabled(mut self, disabled: bool) -> Self {
self.disabled = Some(disabled);
self
}
#[must_use]
pub fn on_change(mut self, action: impl Into<ActionId>) -> Self {
self.on_change = Some(action.into());
self
}
}
impl IntoNode for Select {}
impl From<Select> for Node {
fn from(s: Select) -> Self {
Node::Select(s)
}
}