Skip to main content

Field

Struct Field 

Source
pub struct Field<'a> {
    pub kind: FieldKind,
    pub name: &'a str,
    pub label: &'a str,
    pub hint: Option<&'a str>,
    pub error: Option<&'a str>,
    pub placeholder: Option<&'a str>,
    pub options: &'a [Choice<'a>],
    pub required: bool,
    pub extended: bool,
}
Expand description

One field of a form.

Borrowed rather than owned: a description is built, read once by a renderer, and dropped. Nothing here outlives the screen it describes.

§What it carries, and what it does not

Stated here so the next renderer does not re-ask, which is what the first two both did. It carries everything a renderer needs to draw the field: its kind, what it is called, what it is asked for, its standing help, what is wrong with it now, whether it is compulsory, whether it hides behind a disclosure, its ghost text, and the options it offers.

It does not carry the current value, and it is not going to. That is the one thing here that is genuinely renderer state: a webview reads it back out of the DOM, an immediate-mode renderer holds a &mut to the app’s own field and writes through it, and a terminal keeps an edit buffer. A description that carried the value would have to carry a way to write it back, at which point it is a form model and no longer a description.

Validation is absent for the reason FieldKind records: error is the result of validating, supplied by whoever validated. Nothing here decides that a value is wrong.

Fields§

§kind: FieldKind

What kind of value it takes.

§name: &'a str

The name the value is submitted under.

§label: &'a str

What the user is asked for.

§hint: Option<&'a str>

Standing help, shown whether or not anything is wrong.

§error: Option<&'a str>

What is currently wrong with the value.

§placeholder: Option<&'a str>

Ghost text shown while the field is empty.

User-facing text, and it sits with label and hint rather than with the value because it is a property of the question and not of the answer. It lived renderer-side in makeover-webview until 0.8.0 for one reason and it was not a reading on where it belonged: adding a field to a published struct is a breaking change.

Not a substitute for a label. A field labelled only by its placeholder loses its label the moment anything is typed, and no renderer here can make that not happen, so the description keeps both.

§options: &'a [Choice<'a>]

The options offered, in the order they are offered.

Empty for every kind but FieldKind::Select. A select described with no options is sayable on purpose: it is what an app with an unfinished-loading option list actually has, and a renderer showing an empty select says so on screen rather than in a log.

Which option is current is not here. That is the value, and the value is renderer state.

§required: bool

Whether the form refuses to submit without it.

§extended: bool

Whether the field lives behind a “more options” disclosure.

Implementations§

Source§

impl<'a> Field<'a>

Source

pub const fn new(kind: FieldKind, name: &'a str, label: &'a str) -> Self

A plain required-nothing field of the given kind.

Source

pub const fn select( name: &'a str, label: &'a str, options: &'a [Choice<'a>], ) -> Self

A select offering the given options.

The one kind that is under-described by Field::new, so it gets a constructor rather than leaving every call site to remember that a select with an empty options renders as an empty select.

Source

pub const fn invalid(&self) -> bool

Whether the field is currently reporting a problem.

Read this rather than testing error.is_some() at each renderer: the error state has to mark the field’s whole group and not only the message, because a renderer with no descendant selectors (egui, a terminal) cannot find the group from the message. goingson already marks the group and Balanced Breakfast does not, so goingson’s shape is the one taken here.

Trait Implementations§

Source§

impl<'a> Clone for Field<'a>

Source§

fn clone(&self) -> Field<'a>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<'a> Copy for Field<'a>

Source§

impl<'a> Debug for Field<'a>

Source§

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

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

impl<'a> Eq for Field<'a>

Source§

impl<'a> Hash for Field<'a>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<'a> PartialEq for Field<'a>

Source§

fn eq(&self, other: &Field<'a>) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl<'a> StructuralPartialEq for Field<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Field<'a>

§

impl<'a> RefUnwindSafe for Field<'a>

§

impl<'a> Send for Field<'a>

§

impl<'a> Sync for Field<'a>

§

impl<'a> Unpin for Field<'a>

§

impl<'a> UnsafeUnpin for Field<'a>

§

impl<'a> UnwindSafe for Field<'a>

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
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> 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.