1use nu_protocol::{
2 engine::{EngineState, StateWorkingSet, VirtualPath},
3 VirtualPathId,
4};
5use std::path::PathBuf;
6
7const 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
20pub 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 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 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 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}