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