Skip to main content

nmbrs_runtime/readouts/
registry.rs

1// Copyright 2024-2026 Jonathan Shook
2// SPDX-License-Identifier: Apache-2.0
3
4//! Static registry of built-in readouts.
5//!
6//! Returns [`ReadoutHandle`](super::ReadoutHandle) — an
7//! `Arc<dyn Readout>` — so the rest of the engine can hold
8//! readouts uniformly whether they're compile-time builtins
9//! (this module) or runtime workload-registered customs (a
10//! later push). The Arc allocation per lookup is cheap
11//! (one per workload-load + per phase fire, not per render),
12//! and the unit-struct readouts have zero-size payloads.
13
14use std::sync::Arc;
15
16use super::Readout;
17use super::ReadoutHandle;
18use super::builtins;
19
20/// Looks up a built-in readout by name. Returns `None` when
21/// the name isn't registered; callers turn that into a
22/// load-time error per
23/// `feedback_never_ignore_silently`.
24pub struct Registry;
25
26impl Registry {
27    /// Resolve `name` to its built-in implementation.
28    pub fn lookup(name: &str) -> Option<ReadoutHandle> {
29        match name {
30            "each_close" => Some(Arc::new(builtins::each_close::EachClose) as Arc<dyn Readout>),
31            "error_readout" => {
32                Some(Arc::new(builtins::error_readout::ErrorReadout) as Arc<dyn Readout>)
33            }
34            "metric" => Some(Arc::new(builtins::metric::Metric) as Arc<dyn Readout>),
35            "phase_outcome" => {
36                Some(Arc::new(builtins::phase_outcome::PhaseOutcomeReadout) as Arc<dyn Readout>)
37            }
38            "phase_starting" => {
39                Some(Arc::new(builtins::phase_starting::PhaseStarting) as Arc<dyn Readout>)
40            }
41            "phase_status" => {
42                Some(Arc::new(builtins::phase_status::PhaseStatus) as Arc<dyn Readout>)
43            }
44            "phase_summary" => {
45                Some(Arc::new(builtins::phase_summary::PhaseSummary) as Arc<dyn Readout>)
46            }
47            "scope_close" => Some(Arc::new(builtins::scope_close::ScopeClose) as Arc<dyn Readout>),
48            "scope_header" => {
49                Some(Arc::new(builtins::scope_header::ScopeHeader) as Arc<dyn Readout>)
50            }
51            "scope_open" => Some(Arc::new(builtins::scope_open::ScopeOpen) as Arc<dyn Readout>),
52            "session_banner" => {
53                Some(Arc::new(builtins::session_banner::SessionBanner) as Arc<dyn Readout>)
54            }
55            "session_notice" => {
56                Some(Arc::new(builtins::session_notice::SessionNotice) as Arc<dyn Readout>)
57            }
58            "session_summary" => {
59                Some(Arc::new(builtins::session_summary::SessionSummary) as Arc<dyn Readout>)
60            }
61            "trace" => Some(Arc::new(builtins::trace::Trace) as Arc<dyn Readout>),
62            "truncated_phases" => {
63                Some(Arc::new(builtins::truncated_phases::TruncatedPhases) as Arc<dyn Readout>)
64            }
65            _ => None,
66        }
67    }
68
69    /// All registered built-in names. Used by parser
70    /// diagnostics ("did you mean …?") and by the future
71    /// `nmbrs --list-readouts` introspection.
72    pub fn all_names() -> &'static [&'static str] {
73        &[
74            "each_close",
75            "error_readout",
76            "metric",
77            "phase_outcome",
78            "phase_starting",
79            "phase_status",
80            "phase_summary",
81            "scope_close",
82            "scope_header",
83            "scope_open",
84            "session_banner",
85            "session_notice",
86            "session_summary",
87            "trace",
88            "truncated_phases",
89        ]
90    }
91}