mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 06:55:36 +02:00
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:
@ -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(())
|
||||
}
|
||||
|
Reference in New Issue
Block a user