Lines
95.83 %
Functions
100 %
Branches
//! Generic fetch-state machine for data tabs.
/// Lifecycle of a data-tab fetch request.
///
/// Transitions: `Idle` → `Loading` (on submit) → `Loaded` or `Error` (on reply).
/// A `refresh` resets back to `Idle` so the next `switch_tab` re-fetches.
#[derive(Debug, Clone, PartialEq)]
pub enum Fetch<T> {
/// No request has been issued yet (initial state or after reset).
Idle,
/// A request was issued with the given envelope id; reply is pending.
Loading { id: i64 },
/// Reply received and parsed successfully.
Loaded(T),
/// Reply received but produced an error.
Error(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn idle_is_default_variant() {
let f: Fetch<Vec<String>> = Fetch::Idle;
assert!(matches!(f, Fetch::Idle));
fn loading_carries_id() {
let f: Fetch<()> = Fetch::Loading { id: 7 };
assert!(matches!(f, Fetch::Loading { id: 7 }));
fn loaded_carries_data() {
let f = Fetch::Loaded(vec![1u32, 2, 3]);
assert!(matches!(f, Fetch::Loaded(_)));
if let Fetch::Loaded(v) = f {
assert_eq!(v.len(), 3);
fn error_carries_message() {
let f: Fetch<()> = Fetch::Error("oops".into());
assert!(matches!(f, Fetch::Error(ref s) if s == "oops"));
fn clone_eq_roundtrip() {
let a: Fetch<()> = Fetch::Loading { id: 42 };
let b = a.clone();
assert_eq!(a, b);