overlay new: add --reload(-r) flag (#15849)

# Description
Close: #15747

To support `reload` feature, we just need to save `caller_stack` before
adding overlay, then redirect_env back after the overlay is added.

# User-Facing Changes
NaN

# Tests + Formatting
Added 1 test

# After Submitting
NaN
This commit is contained in:
Wind
2025-06-03 10:11:58 +08:00
committed by GitHub
parent eb9eb09ac5
commit 222c307648
2 changed files with 33 additions and 4 deletions

View File

@ -1,4 +1,4 @@
use nu_engine::command_prelude::*;
use nu_engine::{command_prelude::*, redirect_env};
use nu_protocol::engine::CommandType;
#[derive(Clone)]
@ -18,6 +18,11 @@ impl Command for OverlayNew {
.input_output_types(vec![(Type::Nothing, Type::Nothing)])
.allow_variants_without_examples(true)
.required("name", SyntaxShape::String, "Name of the overlay.")
.switch(
"reload",
"If the overlay already exists, reload its environment.",
Some('r'),
)
// TODO:
// .switch(
// "prefix",
@ -41,13 +46,20 @@ This command is a parser keyword. For details, check:
fn run(
&self,
engine_state: &EngineState,
stack: &mut Stack,
caller_stack: &mut Stack,
call: &Call,
_input: PipelineData,
) -> Result<PipelineData, ShellError> {
let name_arg: Spanned<String> = call.req(engine_state, stack, 0)?;
let name_arg: Spanned<String> = call.req(engine_state, caller_stack, 0)?;
let reload = call.has_flag(engine_state, caller_stack, "reload")?;
stack.add_overlay(name_arg.item);
if reload {
let callee_stack = caller_stack.clone();
caller_stack.add_overlay(name_arg.item);
redirect_env(engine_state, caller_stack, &callee_stack);
} else {
caller_stack.add_overlay(name_arg.item);
}
Ok(PipelineData::empty())
}