Skip to main content

BoundInput

Enum BoundInput 

Source
pub enum BoundInput {
    Value,
    Checkbox,
    Radio,
    Unknown,
    File,
    SelectMultiple,
}
Expand description

What a bind={field} on an element actually WRITES — the one place the whole language decides, so no two walks can disagree about a checkbox.

An <input type="text"> holds its state in value, a string. An <input type="checkbox"> (or type="radio") holds its state in checked, a PRESENCE — and not in the checked ATTRIBUTE either, which is defaultChecked. Writing a checkbox’s state as a value renders value="true" and draws the box UNCHECKED while the page believes it is checked, which is worse than not supporting bind on a checkbox at all: the author has been told their binding was understood.

Variants§

§

Value

value — a text/number/date input, a <textarea>, a <select>.

§

Checkbox

checked, and a click FLIPS it — a checkbox.

§

Radio

checked, and a click SELECTS it — a radio. Split from BoundInput::Checkbox because the two differ exactly where it matters: clicking a chosen radio leaves it chosen, and a lowering that flipped it would let a second click deselect it, which no radio group has ever done.

§

Unknown

The element’s type is computed, so which of the two this is cannot be known until the page runs. Refused rather than guessed: guessing Value is the silent wrong answer above.

§

File

<input type="file">. A browser will not let a page set a file input’s value — a deliberate restriction, because a page that could would be a page that can read any file on your disk by naming it. So a bind here writes nothing, silently, forever.

§

SelectMultiple

<select multiple>. Its value is the LIST of chosen options, so writing one text into it selects at most one and reading it back returns at most one — a visitor’s other selections vanish with no error anywhere.

Implementations§

Source§

impl BoundInput

Source

pub const UNKNOWN_REFUSAL: &'static str = "a `bind` sits on an element whose `type` is computed, so whether it binds a value or a \ checkbox's checked state cannot be known until the page runs. Write the type literally \ (`type=\"checkbox\"` or `type=\"text\"`), or use two elements"

Why a BoundInput::Unknown binding is refused — held here, in ONE place, so the checker and the lowering refuse it in the same words. Two refusals of the same thing in different words send whoever reads one message searching for the other.

Source

pub fn writes_checked(self) -> bool

Whether this binding writes the checked PROPERTY rather than value.

Source

pub fn refusal(self) -> Option<&'static str>

Why this binding cannot be lowered, or None when it can.

★ TOTAL, AND THAT IS THE POINT. A new variant does not compile until somebody decides whether it lowers or is refused BY NAME — silently absent is not one of the options, which is the discipline action_verb_tier_lock holds over every UiStmt. Two of these arms exist because the question used to be asked of the ATTRIBUTES ALONE: with no tag to look at, a file input and a multiple select both fell through to Value and got a text write that does nothing, while the author was told their binding was understood.

Trait Implementations§

Source§

impl Clone for BoundInput

Source§

fn clone(&self) -> BoundInput

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BoundInput

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BoundInput

Source§

fn eq(&self, other: &BoundInput) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for BoundInput

Source§

impl Eq for BoundInput

Source§

impl StructuralPartialEq for BoundInput

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,