#[derive(Clone, Debug, Default, PartialEq)]
pub struct TextInputResponse {
pub changed: bool,
pub text: String,
pub supported: bool,
pub focused: bool,
}
impl TextInputResponse {
pub fn unsupported() -> Self {
Self {
changed: false,
text: String::new(),
supported: false,
focused: false,
}
}
pub fn supported(text: impl Into<String>, changed: bool) -> Self {
Self {
changed,
text: text.into(),
supported: true,
focused: false,
}
}
pub fn supported_focused(text: impl Into<String>, changed: bool, focused: bool) -> Self {
Self {
changed,
text: text.into(),
supported: true,
focused,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct CheckboxResponse {
pub changed: bool,
pub checked: bool,
pub supported: bool,
}
impl CheckboxResponse {
pub fn unsupported() -> Self {
Self {
changed: false,
checked: false,
supported: false,
}
}
pub fn supported(checked: bool, changed: bool) -> Self {
Self {
changed,
checked,
supported: true,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub struct SliderResponse {
pub changed: bool,
pub value: f64,
pub supported: bool,
}
impl SliderResponse {
pub fn unsupported() -> Self {
Self {
changed: false,
value: 0.0,
supported: false,
}
}
pub fn supported(value: f64, changed: bool) -> Self {
Self {
changed,
value,
supported: true,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct DropdownResponse {
pub changed: bool,
pub selected: usize,
pub supported: bool,
}
impl DropdownResponse {
pub fn unsupported() -> Self {
Self {
changed: false,
selected: 0,
supported: false,
}
}
pub fn supported(selected: usize, changed: bool) -> Self {
Self {
changed,
selected,
supported: true,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct WidgetResponse {
pub supported: bool,
}
impl WidgetResponse {
pub fn unsupported() -> Self {
Self { supported: false }
}
pub fn supported() -> Self {
Self { supported: true }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unsupported_constructors_set_flag_false() {
assert!(!TextInputResponse::unsupported().supported);
assert!(!CheckboxResponse::unsupported().supported);
assert!(!SliderResponse::unsupported().supported);
assert!(!DropdownResponse::unsupported().supported);
assert!(!WidgetResponse::unsupported().supported);
}
#[test]
fn unsupported_payloads_are_zeroed() {
assert_eq!(TextInputResponse::unsupported().text, "");
assert!(!TextInputResponse::unsupported().changed);
assert!(!CheckboxResponse::unsupported().checked);
assert_eq!(SliderResponse::unsupported().value, 0.0);
assert_eq!(DropdownResponse::unsupported().selected, 0);
}
#[test]
fn supported_constructors_carry_payload() {
let t = TextInputResponse::supported("hi", true);
assert!(t.supported && t.changed && t.text == "hi");
let c = CheckboxResponse::supported(true, true);
assert!(c.supported && c.checked && c.changed);
let s = SliderResponse::supported(0.5, false);
assert!(s.supported && !s.changed && (s.value - 0.5).abs() < 1e-9);
let d = DropdownResponse::supported(3, true);
assert!(d.supported && d.changed && d.selected == 3);
assert!(WidgetResponse::supported().supported);
}
#[test]
fn defaults_match_unsupported_for_flag() {
assert_eq!(
CheckboxResponse::default().supported,
CheckboxResponse::unsupported().supported
);
assert_eq!(WidgetResponse::default(), WidgetResponse::unsupported());
}
}