1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
use crate::elem::{HtmlProp, HtmlProps};
use std::borrow::Cow;
use web_sys::HtmlSelectElement;

#[allow(non_camel_case_types)]
#[derive(Clone, PartialEq)]
pub enum SelectProp {
    autofocus(bool),
    autocomplete(Cow<'static, str>),
    disabled(bool),
    multiple(bool),
    name(Cow<'static, str>),
    required(bool),
    size(u32),
    length(u32),
    selected_index(i32),
    value(Cow<'static, str>),
}

#[sealed::sealed]
impl crate::elem::HtmlComponent for HtmlSelectElement {
    type PropEnum = SelectProp;
}
#[sealed::sealed]
impl crate::elem::PropEnum<HtmlSelectElement> for SelectProp {
    fn unset_on(&self, elem: &HtmlSelectElement) {
        match self {
            SelectProp::autofocus(_) => elem.remove_attribute("autofocus").unwrap(),
            SelectProp::autocomplete(_) => elem.remove_attribute("autocomplete").unwrap(),
            SelectProp::disabled(_) => elem.remove_attribute("disabled").unwrap(),
            SelectProp::multiple(_) => elem.remove_attribute("multiple").unwrap(),
            SelectProp::name(_) => elem.remove_attribute("name").unwrap(),
            SelectProp::required(_) => elem.remove_attribute("required").unwrap(),
            SelectProp::size(_) => elem.remove_attribute("size").unwrap(),
            SelectProp::length(_) => elem.remove_attribute("length").unwrap(),
            SelectProp::selected_index(_) => elem.remove_attribute("selected_index").unwrap(),
            SelectProp::value(_) => elem.remove_attribute("value").unwrap(),
        }
    }

    fn set_on(&self, elem: &HtmlSelectElement) {
        match self {
            SelectProp::autofocus(v) => elem.set_autofocus(*v),
            SelectProp::autocomplete(v) => elem.set_autocomplete(v),
            SelectProp::disabled(v) => elem.set_disabled(*v),
            SelectProp::multiple(v) => elem.set_multiple(*v),
            SelectProp::name(v) => elem.set_name(v),
            SelectProp::required(v) => elem.set_required(*v),
            SelectProp::size(v) => elem.set_size(*v),
            SelectProp::length(v) => elem.set_length(*v),
            SelectProp::selected_index(v) => elem.set_selected_index(*v),
            SelectProp::value(v) => elem.set_value(v),
        }
    }
}

impl HtmlProps<HtmlSelectElement> {
    pub fn autofocus(mut self, val: bool) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::autofocus(val)));
        self
    }

    pub fn autocomplete(mut self, val: impl Into<Cow<'static, str>>) -> Self {
        let val = val.into();
        self.0
            .push_back(HtmlProp::Own(SelectProp::autocomplete(val)));
        self
    }

    pub fn disabled(mut self, val: bool) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::disabled(val)));
        self
    }

    pub fn multiple(mut self, val: bool) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::multiple(val)));
        self
    }

    pub fn name(mut self, val: impl Into<Cow<'static, str>>) -> Self {
        let val = val.into();
        self.0.push_back(HtmlProp::Own(SelectProp::name(val)));
        self
    }

    pub fn required(mut self, val: bool) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::required(val)));
        self
    }

    pub fn size(mut self, val: u32) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::size(val)));
        self
    }

    pub fn length(mut self, val: u32) -> Self {
        self.0.push_back(HtmlProp::Own(SelectProp::length(val)));
        self
    }

    pub fn selected_index(mut self, val: i32) -> Self {
        self.0
            .push_back(HtmlProp::Own(SelectProp::selected_index(val)));
        self
    }

    pub fn value(mut self, val: impl Into<Cow<'static, str>>) -> Self {
        let val = val.into();
        self.0.push_back(HtmlProp::Own(SelectProp::value(val)));
        self
    }
}