Skip to main content

harn_stdlib/
lib.rs

1//! Canonical embedded Harn standard library source catalog.
2//!
3//! This crate intentionally contains only static source strings so runtime and
4//! static tooling crates can share the same stdlib modules without depending on
5//! each other.
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub struct StdlibSource {
9    pub module: &'static str,
10    pub source: &'static str,
11}
12
13pub const STDLIB_SOURCES: &[StdlibSource] = &[
14    StdlibSource {
15        module: "text",
16        source: include_str!("stdlib/stdlib_text.harn"),
17    },
18    StdlibSource {
19        module: "collections",
20        source: include_str!("stdlib/stdlib_collections.harn"),
21    },
22    StdlibSource {
23        module: "math",
24        source: include_str!("stdlib/stdlib_math.harn"),
25    },
26    StdlibSource {
27        module: "path",
28        source: include_str!("stdlib/stdlib_path.harn"),
29    },
30    StdlibSource {
31        module: "json",
32        source: include_str!("stdlib/stdlib_json.harn"),
33    },
34    StdlibSource {
35        module: "graphql",
36        source: include_str!("stdlib/stdlib_graphql.harn"),
37    },
38    StdlibSource {
39        module: "schema",
40        source: include_str!("stdlib/stdlib_schema.harn"),
41    },
42    StdlibSource {
43        module: "testing",
44        source: include_str!("stdlib/stdlib_testing.harn"),
45    },
46    StdlibSource {
47        module: "files",
48        source: include_str!("stdlib/stdlib_files.harn"),
49    },
50    StdlibSource {
51        module: "vision",
52        source: include_str!("stdlib/stdlib_vision.harn"),
53    },
54    StdlibSource {
55        module: "context",
56        source: include_str!("stdlib/stdlib_context.harn"),
57    },
58    StdlibSource {
59        module: "runtime",
60        source: include_str!("stdlib/stdlib_runtime.harn"),
61    },
62    StdlibSource {
63        module: "review",
64        source: include_str!("stdlib/stdlib_review.harn"),
65    },
66    StdlibSource {
67        module: "experiments",
68        source: include_str!("stdlib/stdlib_experiments.harn"),
69    },
70    StdlibSource {
71        module: "project",
72        source: include_str!("stdlib/stdlib_project.harn"),
73    },
74    StdlibSource {
75        module: "prompt_library",
76        source: include_str!("stdlib/stdlib_prompt_library.harn"),
77    },
78    StdlibSource {
79        module: "async",
80        source: include_str!("stdlib/stdlib_async.harn"),
81    },
82    StdlibSource {
83        module: "agents",
84        source: include_str!("stdlib/stdlib_agents.harn"),
85    },
86    StdlibSource {
87        module: "agent_state",
88        source: include_str!("stdlib/stdlib_agent_state.harn"),
89    },
90    StdlibSource {
91        module: "memory",
92        source: include_str!("stdlib/stdlib_memory.harn"),
93    },
94    StdlibSource {
95        module: "postgres",
96        source: include_str!("stdlib/stdlib_postgres.harn"),
97    },
98    StdlibSource {
99        module: "checkpoint",
100        source: include_str!("stdlib/stdlib_checkpoint.harn"),
101    },
102    StdlibSource {
103        module: "host",
104        source: include_str!("stdlib/stdlib_host.harn"),
105    },
106    StdlibSource {
107        module: "git",
108        source: include_str!("stdlib/stdlib_git.harn"),
109    },
110    StdlibSource {
111        module: "hitl",
112        source: include_str!("stdlib/stdlib_hitl.harn"),
113    },
114    StdlibSource {
115        module: "trust",
116        source: include_str!("stdlib/stdlib_trust.harn"),
117    },
118    StdlibSource {
119        module: "corrections",
120        source: include_str!("stdlib/stdlib_corrections.harn"),
121    },
122    StdlibSource {
123        module: "plan",
124        source: include_str!("stdlib/stdlib_plan.harn"),
125    },
126    StdlibSource {
127        module: "waitpoints",
128        source: include_str!("stdlib/stdlib_waitpoints.harn"),
129    },
130    StdlibSource {
131        module: "waitpoint",
132        source: include_str!("stdlib/stdlib_waitpoint.harn"),
133    },
134    StdlibSource {
135        module: "monitors",
136        source: include_str!("stdlib/stdlib_monitors.harn"),
137    },
138    StdlibSource {
139        module: "worktree",
140        source: include_str!("stdlib/stdlib_worktree.harn"),
141    },
142    StdlibSource {
143        module: "acp",
144        source: include_str!("stdlib/stdlib_acp.harn"),
145    },
146    StdlibSource {
147        module: "triggers",
148        source: include_str!("stdlib/stdlib_triggers.harn"),
149    },
150    StdlibSource {
151        module: "personas/prelude",
152        source: include_str!("stdlib/stdlib_personas_prelude.harn"),
153    },
154    StdlibSource {
155        module: "connectors/shared",
156        source: include_str!("stdlib/stdlib_connectors_shared.harn"),
157    },
158    StdlibSource {
159        module: "connectors/github",
160        source: include_str!("stdlib/stdlib_connectors_github.harn"),
161    },
162    StdlibSource {
163        module: "connectors/linear",
164        source: include_str!("stdlib/stdlib_connectors_linear.harn"),
165    },
166    StdlibSource {
167        module: "connectors/notion",
168        source: include_str!("stdlib/stdlib_connectors_notion.harn"),
169    },
170    StdlibSource {
171        module: "connectors/slack",
172        source: include_str!("stdlib/stdlib_connectors_slack.harn"),
173    },
174];
175
176pub fn get_stdlib_source(module: &str) -> Option<&'static str> {
177    STDLIB_SOURCES
178        .iter()
179        .find_map(|entry| (entry.module == module).then_some(entry.source))
180}
181
182#[cfg(test)]
183mod tests {
184    use std::collections::BTreeSet;
185
186    use super::{get_stdlib_source, STDLIB_SOURCES};
187
188    #[test]
189    fn stdlib_sources_are_non_empty() {
190        for entry in STDLIB_SOURCES {
191            assert!(
192                !entry.source.trim().is_empty(),
193                "{} should have non-empty source",
194                entry.module
195            );
196        }
197    }
198
199    #[test]
200    fn stdlib_source_names_are_unique() {
201        let mut names = BTreeSet::new();
202        for entry in STDLIB_SOURCES {
203            assert!(names.insert(entry.module), "duplicate {}", entry.module);
204        }
205    }
206
207    #[test]
208    fn key_stdlib_modules_resolve() {
209        for module in [
210            "context",
211            "waitpoint",
212            "personas/prelude",
213            "connectors/shared",
214            "connectors/github",
215            "connectors/linear",
216            "connectors/notion",
217            "connectors/slack",
218        ] {
219            assert!(
220                get_stdlib_source(module).is_some(),
221                "std/{module} should resolve"
222            );
223        }
224    }
225}