Skip to main content

http_nu/stdlib/
mod.rs

1use nu_protocol::{
2    engine::{EngineState, StateWorkingSet, VirtualPath},
3    VirtualPathId,
4};
5use std::path::PathBuf;
6
7// Embedded stdlib files
8const STDLIB_MOD: &str = include_str!("mod.nu");
9const ROUTER_MOD: &str = include_str!("router/mod.nu");
10const HTML_MOD: &str = include_str!("html/mod.nu");
11const DATASTAR_MOD: &str = include_str!("datastar/mod.nu");
12
13fn create_virt_file(working_set: &mut StateWorkingSet, name: &str, content: &str) -> VirtualPathId {
14    let sanitized_name = PathBuf::from(name).to_string_lossy().to_string();
15    let file_id = working_set.add_file(sanitized_name.clone(), content.as_bytes());
16    working_set.add_virtual_path(sanitized_name, VirtualPath::File(file_id))
17}
18
19/// Load the http-nu standard library into the engine state
20///
21/// This embeds the stdlib modules at compile time and makes them available
22/// via the virtual filesystem. Users can import with: use http-nu/router *, use http-nu/html *
23pub fn load_http_nu_stdlib(engine_state: &mut EngineState) -> Result<(), miette::ErrReport> {
24    let mut working_set = StateWorkingSet::new(engine_state);
25    let mut http_nu_virt_paths = vec![];
26
27    // http-nu/mod.nu (main entry point)
28    let std_mod_virt_file_id = create_virt_file(&mut working_set, "http-nu/mod.nu", STDLIB_MOD);
29    http_nu_virt_paths.push(std_mod_virt_file_id);
30
31    // Submodules
32    let std_submodules = vec![
33        ("mod.nu", "http-nu/router", ROUTER_MOD),
34        ("mod.nu", "http-nu/html", HTML_MOD),
35        ("mod.nu", "http-nu/datastar", DATASTAR_MOD),
36    ];
37
38    for (filename, std_subdir_name, content) in std_submodules {
39        let mod_dir = PathBuf::from(std_subdir_name);
40        let name = mod_dir.join(filename);
41        let virt_file_id = create_virt_file(&mut working_set, &name.to_string_lossy(), content);
42
43        let mod_dir_filelist = vec![virt_file_id];
44        let virt_dir_id = working_set.add_virtual_path(
45            mod_dir.to_string_lossy().to_string(),
46            VirtualPath::Dir(mod_dir_filelist),
47        );
48        http_nu_virt_paths.push(virt_dir_id);
49    }
50
51    // Create http-nu virtual directory
52    let std_dir = PathBuf::from("http-nu").to_string_lossy().to_string();
53    let _ = working_set.add_virtual_path(std_dir, VirtualPath::Dir(http_nu_virt_paths));
54
55    engine_state.merge_delta(working_set.render())?;
56
57    Ok(())
58}