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
//! Core model traits for TEA (The Elm Architecture).
//!
//! Two traits are provided:
//! - [`Model`]: String-based rendering (simple, low-level)
//! - [`ElementModel`]: Element tree rendering (recommended, Flexbox layout)
use crate::cmd::Cmd;
use crate::element::Element;
/// A TEA model with string-based rendering.
///
/// Implement this trait for simple applications that render directly to a string.
/// For most use cases, prefer [`ElementModel`] which provides Flexbox layout.
pub trait Model: Send + 'static {
type Msg: Send + 'static;
/// Called once when the program starts. Return a command to perform initialization.
fn init(&mut self) -> Option<Cmd<Self::Msg>> {
None
}
/// Handle a message and update state. Return an optional command.
fn update(&mut self, msg: Self::Msg) -> Option<Cmd<Self::Msg>>;
/// Render the current state to a string.
fn view(&self) -> String;
/// Where to place the real terminal cursor as `(column, row)`, or `None` to
/// keep it hidden. Returning a position shows a normal blinking cursor at the
/// text insertion point — the correct behaviour for input fields (including
/// wide CJK glyphs), instead of a faked reverse-video block.
fn cursor(&self) -> Option<(u16, u16)> {
None
}
}
/// A TEA model with Element tree rendering and Flexbox layout.
///
/// This is the recommended trait for building terminal UIs. The `view()` method
/// returns an [`Element`] tree that is laid out using Flexbox and rendered
/// incrementally.
pub trait ElementModel: Send + 'static {
type Msg: Send + 'static;
/// Called once when the program starts. Return a command to perform initialization.
fn init(&mut self) -> Option<Cmd<Self::Msg>> {
None
}
/// Handle a message and update state. Return an optional command.
fn update(&mut self, msg: Self::Msg) -> Option<Cmd<Self::Msg>>;
/// Build the UI element tree from current state.
fn view(&self) -> Element<Self::Msg>;
}