cu_profiler_core/
program_registry.rs1use std::collections::HashMap;
7
8#[derive(Debug, Clone, Default)]
10pub struct ProgramRegistry {
11 labels: HashMap<String, String>,
12}
13
14const 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 #[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 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 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 #[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 #[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}