#[non_exhaustive]pub enum FieldKind {
Text,
Secret,
Number,
Email,
Url,
Tel,
Textarea,
Select,
Radio,
Checkbox,
File,
Hidden,
}Expand description
What kind of value a form field takes.
The union of the two vocabularies that diverged, which is what triggered
this crate. They have since converged on their own: both apps now have a
renderFormField emitting the same anatomy, and what is left differing is
the kind set, the error shape, and whether the return is a string or a node.
Validation is deliberately absent. Neither app has a shared story (goingson
validates after collecting the form data, with per-field transform hooks;
Balanced Breakfast has required and nothing else), and a schema that
describes fields but not constraints acquires a constraint layer per app,
which is exactly how the current divergence started. Naming it absent is a
decision; leaving it unmentioned would not be.
#[non_exhaustive] for the reason Fill is: renderers match on this and
the set keeps growing, so growth must not be a lockstep event. Email, Url
and Tel arriving in 0.5.0 is the second growth in two releases.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Text
A single line of text.
Secret
A single line of text that must never be echoed, logged or round-tripped through anything that might persist it.
Number
A number.
An email address.
Distinct from Text because the distinction is not
decoration: a webview renderer emits type="email", which on a touch
device changes the keyboard that appears and turns on the platform’s own
validation. goingson ships to iOS, so collapsing this into text costs a
keyboard with no @ on it.
Added 0.5.0, from goingson’s contact form.
Url
A URL. Same reasoning as Email.
Added 0.5.0, from goingson’s contact-social and contact-feed forms.
Tel
A telephone number. Same reasoning as Email, and the
clearest case of it: the keyboard is a numeric pad rather than letters.
Added 0.5.0, from goingson’s contact-phone form.
Textarea
Several lines of text.
Select
One of a fixed set, offered behind a control that shows one at a time.
Radio
One of a fixed set, with every option on screen at once.
Not a presentation of Select, which is the reading to
resist: what differs is a property of the question. A choice that is
consequential or irreversible has to be readable without opening
anything, because a closed control shows one option and hides the rest,
and the one it shows is whichever was current before the user had read
the alternatives. audiofiles asks whether a library copies samples into
its store or references them where they lie — which cannot be changed
afterwards — and had already promoted that out of a checkbox by hand,
with a comment giving this reason, before the description could say it.
It is also the one HTML input type this enum was missing. Everything
else here is an <input type=...>, a <select> or a <textarea>, and
the hole was radio.
Added 0.8.1, from audiofiles’ Add Library form.
Checkbox
On or off.
File
A file the user picks from wherever the host keeps files.
Added 0.11.0, 844b5ae0, from goingson’s project-dashboard attachments
column. It was filed as a router finding — a control whose destination is
a host capability rather than an address — and splitting it is what made
it two answers instead of one member satisfying neither. Opening a file
is a one-way handoff and needs no new API. Picking one returns a value
into a write, which is a form concern, which is this.
The membership test passes on every host and not by a stretch: a Tauri
app opens a native picker, a server renders <input type="file">, a
terminal prompts for a path, a CLI takes an argument. That is closer to
Email, which exists because it changes the keyboard,
than to anything bespoke.
It carries no accepted-types list and no multiple flag, and that is
measured rather than deferred: accept appears at zero sites in either
app. A member added for a case nobody has is a member designed against
nothing.
Hidden
Carried through the form and never shown.
Implementations§
Source§impl FieldKind
impl FieldKind
Sourcepub const fn confidential(self) -> bool
pub const fn confidential(self) -> bool
Whether the value must be kept out of logs and diagnostics.
Sourcepub const fn labels_itself(self) -> bool
pub const fn labels_itself(self) -> bool
Where the field’s own label sits.
A checkbox labels itself on the right of the box; everything else takes a label above. Both webview apps already do this and both special-case it inline, which is the tell that it belongs in the description.
A Radio is not one of them, and the near-miss is worth
naming: its options each label themselves, but the field still asks a
question above them, so the group takes a label like everything else.
Sourcepub const fn offers_options(self) -> bool
pub const fn offers_options(self) -> bool
Whether the kind reads Field::options.
Two kinds do, so the pair is named once here rather than spelled out at
each renderer and again in Field::options’ own doc, where “every
kind but Select” was true for exactly one release. A third
option-taking kind should land here and nowhere else.