Lines
93.55 %
Functions
50 %
Branches
100 %
pub mod amount;
pub mod date;
pub mod editor;
pub mod select;
pub mod splits;
pub use amount::AmountWidget;
pub use date::DateWidget;
pub use editor::{EditMode, Editor, VimAction, VimMode};
pub use select::{SelectOption, SelectWidget};
pub use splits::{FocusedSubWidget, SplitRow, SplitRowPrefill, SplitsWidget};
#[cfg(test)]
mod tests;
/// Discriminant for widget-first key routing without carrying widget data.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WidgetKind {
Text,
Select,
Amount,
Date,
Splits,
}
/// The primary widget union — enum dispatch, no `Box<dyn>`, derives `Debug`.
#[derive(Debug)]
pub enum Widget {
Text(Editor),
Select(SelectWidget),
Amount(AmountWidget),
Date(DateWidget),
Splits(SplitsWidget),
impl Widget {
/// The submittable string value of this widget.
///
/// Returns `""` for `Splits` (rows validated separately via [`SplitsWidget::rows`]).
#[must_use]
pub fn value(&self) -> &str {
match self {
Self::Text(ed) => ed.buffer(),
Self::Select(sw) => sw.value(),
Self::Amount(aw) => aw.value(),
Self::Date(dw) => dw.value(),
Self::Splits(_) => "",
/// The display string for rendering (label for `Select`, buffer for others).
pub fn display(&self) -> String {
Self::Text(ed) => ed.buffer().to_string(),
Self::Select(sw) => sw.display().to_string(),
Self::Amount(aw) => aw.value().to_string(),
Self::Date(dw) => dw.value().to_string(),
Self::Splits(sw) => sw.display(),
/// Mutable reference to the inner [`Editor`] for `Text`, `Amount`, and
/// `Date` variants. Returns `None` for `Select` and `Splits`.
pub fn as_text_mut(&mut self) -> Option<&mut Editor> {
Self::Text(ed) => Some(ed),
Self::Amount(aw) => Some(aw.as_editor_mut()),
Self::Date(dw) => Some(dw.as_editor_mut()),
Self::Select(_) | Self::Splits(_) => None,
/// Variant discriminant used for widget-first key routing decisions.
pub fn kind(&self) -> WidgetKind {
Self::Text(_) => WidgetKind::Text,
Self::Select(_) => WidgetKind::Select,
Self::Amount(_) => WidgetKind::Amount,
Self::Date(_) => WidgetKind::Date,
Self::Splits(_) => WidgetKind::Splits,