Skip to main content

cu_profiler_core/
program_registry.rs

1//! Registry mapping program IDs (base-58 pubkeys) to human labels.
2//!
3//! Ships with the well-known native and SPL program IDs and is extensible from
4//! configuration. Unknown programs render as `Unknown Program <pubkey>`.
5
6use std::collections::HashMap;
7
8/// Bidirectional-ish lookup from program ID to a display label.
9#[derive(Debug, Clone, Default)]
10pub struct ProgramRegistry {
11    labels: HashMap<String, String>,
12}
13
14/// The built-in, well-known program labels.
15const BUILTINS: &[(&str, &str)] = &[
16    ("11111111111111111111111111111111", "System Program"),
17    (
18        "ComputeBudget111111111111111111111111111111",
19        "Compute Budget Program",
20    ),
21    ("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "SPL Token"),
22    ("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "Token-2022"),
23    (
24        "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
25        "Associated Token Account Program",
26    ),
27    (
28        "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",
29        "Memo Program",
30    ),
31];
32
33impl ProgramRegistry {
34    /// A registry pre-loaded with the well-known program IDs.
35    #[must_use]
36    pub fn with_builtins() -> Self {
37        let mut labels = HashMap::with_capacity(BUILTINS.len());
38        for (id, name) in BUILTINS {
39            labels.insert((*id).to_string(), (*name).to_string());
40        }
41        Self { labels }
42    }
43
44    /// Register or override a label for a program ID.
45    pub fn insert(&mut self, program_id: impl Into<String>, label: impl Into<String>) {
46        self.labels.insert(program_id.into(), label.into());
47    }
48
49    /// Merge labels from configuration, overriding any existing entries.
50    pub fn extend_from<I, K, V>(&mut self, entries: I)
51    where
52        I: IntoIterator<Item = (K, V)>,
53        K: Into<String>,
54        V: Into<String>,
55    {
56        for (k, v) in entries {
57            self.insert(k, v);
58        }
59    }
60
61    /// The known label for a program ID, if any.
62    #[must_use]
63    pub fn label(&self, program_id: &str) -> Option<&str> {
64        self.labels.get(program_id).map(String::as_str)
65    }
66
67    /// A label suitable for display: the known name, or `Unknown Program <id>`.
68    #[must_use]
69    pub fn display_label(&self, program_id: &str) -> String {
70        match self.label(program_id) {
71            Some(name) => name.to_string(),
72            None => format!("Unknown Program {program_id}"),
73        }
74    }
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80
81    #[test]
82    fn known_program_resolves() {
83        let r = ProgramRegistry::with_builtins();
84        assert_eq!(
85            r.label("11111111111111111111111111111111"),
86            Some("System Program")
87        );
88    }
89
90    #[test]
91    fn unknown_program_gets_placeholder() {
92        let r = ProgramRegistry::with_builtins();
93        assert_eq!(r.display_label("Zz99"), "Unknown Program Zz99");
94    }
95
96    #[test]
97    fn config_can_override() {
98        let mut r = ProgramRegistry::with_builtins();
99        r.extend_from([("MyProg111", "My Program")]);
100        assert_eq!(r.label("MyProg111"), Some("My Program"));
101    }
102}