Move std-rfc into Nushell (#15042)

Move `std-rfc` into Nushell.  `use std-rfc/<submodule>` now works "out-of-the-box"
This commit is contained in:
Douglas
2025-02-09 09:03:37 -05:00
committed by GitHub
parent bfe398ca36
commit 5b4dd775d4
16 changed files with 1967 additions and 17 deletions

View File

@ -1,11 +1,9 @@
#![doc = include_str!("../README.md")]
use log::trace;
use nu_engine::eval_block;
use nu_parser::parse;
use nu_protocol::{
debugger::WithoutDebug,
engine::{FileStack, Stack, StateWorkingSet, VirtualPath},
report_parse_error, PipelineData, VirtualPathId,
engine::{FileStack, StateWorkingSet, VirtualPath},
report_parse_error, VirtualPathId,
};
use std::path::PathBuf;
@ -22,6 +20,7 @@ pub fn load_standard_library(
trace!("load_standard_library");
let mut working_set = StateWorkingSet::new(engine_state);
// Contents of the std virtual directory
let mut std_virt_paths = vec![];
@ -81,8 +80,70 @@ pub fn load_standard_library(
let std_dir = PathBuf::from("std").to_string_lossy().to_string();
let _ = working_set.add_virtual_path(std_dir, VirtualPath::Dir(std_virt_paths));
// Add std-rfc files
let mut std_rfc_virt_paths = vec![];
// std-rfc/mod.nu
let std_rfc_mod_virt_file_id = create_virt_file(
&mut working_set,
"std-rfc/mod.nu",
include_str!("../std-rfc/mod.nu"),
);
std_rfc_virt_paths.push(std_rfc_mod_virt_file_id);
// Submodules/subdirectories ... std-rfc/<module>/mod.nu
let mut std_rfc_submodules = vec![
(
"mod.nu",
"std-rfc/clip",
include_str!("../std-rfc/clip/mod.nu"),
),
(
"mod.nu",
"std-rfc/conversions",
include_str!("../std-rfc/conversions/mod.nu"),
),
#[cfg(feature = "sqlite")]
("mod.nu", "std-rfc/kv", include_str!("../std-rfc/kv/mod.nu")),
(
"mod.nu",
"std-rfc/path",
include_str!("../std-rfc/path/mod.nu"),
),
(
"mod.nu",
"std-rfc/str",
include_str!("../std-rfc/str/mod.nu"),
),
(
"mod.nu",
"std-rfc/tables",
include_str!("../std-rfc/tables/mod.nu"),
),
];
for (filename, std_rfc_subdir_name, content) in std_rfc_submodules.drain(..) {
let mod_dir = PathBuf::from(std_rfc_subdir_name);
let name = mod_dir.join(filename);
let virt_file_id = create_virt_file(&mut working_set, &name.to_string_lossy(), content);
// Place file in virtual subdir
let mod_dir_filelist = vec![virt_file_id];
let virt_dir_id = working_set.add_virtual_path(
mod_dir.to_string_lossy().to_string(),
VirtualPath::Dir(mod_dir_filelist),
);
// Add the subdir to the list of paths in std
std_rfc_virt_paths.push(virt_dir_id);
}
// Create std virtual dir with all subdirs and files
let std_rfc_dir = PathBuf::from("std-rfc").to_string_lossy().to_string();
let _ = working_set.add_virtual_path(std_rfc_dir, VirtualPath::Dir(std_rfc_virt_paths));
// Load prelude
let (block, delta) = {
let (_, delta) = {
let source = r#"
# Prelude
use std/prelude *
@ -95,7 +156,7 @@ use std/prelude *
let block = parse(
&mut working_set,
Some("loading stdlib"),
Some("loading stdlib prelude"),
source.as_bytes(),
false,
);
@ -112,13 +173,5 @@ use std/prelude *
engine_state.merge_delta(delta)?;
// We need to evaluate the module in order to run the `export-env` blocks.
let mut stack = Stack::new();
let pipeline_data = PipelineData::Empty;
eval_block::<WithoutDebug>(engine_state, &mut stack, &block, pipeline_data)?;
engine_state.merge_env(&mut stack)?;
Ok(())
}