use proc_macro2::TokenStream;
use quote::quote;
use crate::WidgetKind;
pub fn generate_status_mapping(
widget_kind: &WidgetKind,
status_ident: &syn::Ident,
) -> Option<TokenStream> {
match widget_kind {
WidgetKind::Button => Some(generate_button_status_mapping(status_ident)),
WidgetKind::TextInput => Some(generate_text_input_status_mapping(status_ident)),
WidgetKind::Checkbox => Some(generate_checkbox_status_mapping(status_ident)),
WidgetKind::Radio => Some(generate_radio_status_mapping(status_ident)),
WidgetKind::Toggler => Some(generate_toggler_status_mapping(status_ident)),
WidgetKind::Slider => Some(generate_slider_status_mapping(status_ident)),
WidgetKind::PickList => Some(generate_picklist_status_mapping(status_ident)),
WidgetKind::ComboBox => Some(generate_combo_box_status_mapping(status_ident)),
_ => None, }
}
fn generate_button_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::button::Status;
match #status_ident {
Status::Active => None,
Status::Hovered => Some(dampen_core::ir::WidgetState::Hover),
Status::Pressed => Some(dampen_core::ir::WidgetState::Active),
Status::Disabled => Some(dampen_core::ir::WidgetState::Disabled),
}
}
}
}
fn generate_text_input_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::text_input::Status;
match #status_ident {
Status::Active => None,
Status::Hovered => Some(dampen_core::ir::WidgetState::Hover),
Status::Focused { .. } => Some(dampen_core::ir::WidgetState::Focus),
Status::Disabled => Some(dampen_core::ir::WidgetState::Disabled),
}
}
}
}
fn generate_checkbox_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::checkbox::Status;
match #status_ident {
Status::Active { .. } => None,
Status::Hovered { .. } => Some(dampen_core::ir::WidgetState::Hover),
Status::Disabled { .. } => Some(dampen_core::ir::WidgetState::Disabled),
}
}
}
}
fn generate_radio_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::radio::Status;
match #status_ident {
Status::Active { .. } => None,
Status::Hovered { .. } => Some(dampen_core::ir::WidgetState::Hover),
}
}
}
}
fn generate_toggler_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::toggler::Status;
match #status_ident {
Status::Active { .. } => None,
Status::Hovered { .. } => Some(dampen_core::ir::WidgetState::Hover),
Status::Disabled { .. } => Some(dampen_core::ir::WidgetState::Disabled),
}
}
}
}
fn generate_slider_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::slider::Status;
match #status_ident {
Status::Active => None,
Status::Hovered => Some(dampen_core::ir::WidgetState::Hover),
Status::Dragged => Some(dampen_core::ir::WidgetState::Active),
}
}
}
}
fn generate_picklist_status_mapping(status_ident: &syn::Ident) -> TokenStream {
quote! {
{
use iced::widget::pick_list::Status;
match #status_ident {
Status::Active => None,
Status::Hovered => Some(dampen_core::ir::WidgetState::Hover),
Status::Opened { .. } => Some(dampen_core::ir::WidgetState::Focus),
}
}
}
}
fn generate_combo_box_status_mapping(status_ident: &syn::Ident) -> TokenStream {
generate_text_input_status_mapping(status_ident)
}
#[cfg(test)]
mod tests {
use super::*;
use quote::format_ident;
#[test]
fn test_button_status_mapping_generated() {
let status = format_ident!("status");
let mapping = generate_status_mapping(&WidgetKind::Button, &status);
assert!(mapping.is_some());
let code = mapping.unwrap().to_string();
assert!(code.contains("Active"));
assert!(code.contains("Hovered"));
assert!(code.contains("Pressed"));
assert!(code.contains("Disabled"));
assert!(code.contains("WidgetState"));
}
#[test]
fn test_text_input_status_mapping_generated() {
let status = format_ident!("status");
let mapping = generate_status_mapping(&WidgetKind::TextInput, &status);
assert!(mapping.is_some());
let code = mapping.unwrap().to_string();
assert!(code.contains("Focused"));
assert!(code.contains("WidgetState"));
}
#[test]
fn test_checkbox_status_mapping_generated() {
let status = format_ident!("status");
let mapping = generate_status_mapping(&WidgetKind::Checkbox, &status);
assert!(mapping.is_some());
let code = mapping.unwrap().to_string();
assert!(code.contains("Active"));
assert!(code.contains("Hovered"));
assert!(code.contains("WidgetState"));
}
#[test]
fn test_unsupported_widget_returns_none() {
let status = format_ident!("status");
let mapping = generate_status_mapping(&WidgetKind::Text, &status);
assert!(mapping.is_none());
}
#[test]
fn test_slider_status_mapping_generated() {
let status = format_ident!("status");
let mapping = generate_status_mapping(&WidgetKind::Slider, &status);
assert!(mapping.is_some());
let code = mapping.unwrap().to_string();
assert!(code.contains("Dragged"));
assert!(code.contains("WidgetState"));
}
#[test]
fn test_combo_box_uses_text_input_mapping() {
let status = format_ident!("status");
let combo_mapping = generate_status_mapping(&WidgetKind::ComboBox, &status);
let text_mapping = generate_status_mapping(&WidgetKind::TextInput, &status);
assert!(combo_mapping.is_some());
assert!(text_mapping.is_some());
let combo_code = combo_mapping.unwrap().to_string();
let text_code = text_mapping.unwrap().to_string();
assert_eq!(combo_code, text_code);
}
}