nu_cmd_lang/core_commands/overlay/
hide.rs1use nu_engine::command_prelude::*;
2use nu_protocol::engine::CommandType;
3
4#[derive(Clone)]
5pub struct OverlayHide;
6
7impl Command for OverlayHide {
8 fn name(&self) -> &str {
9 "overlay hide"
10 }
11
12 fn description(&self) -> &str {
13 "Hide an active overlay."
14 }
15
16 fn signature(&self) -> nu_protocol::Signature {
17 Signature::build("overlay hide")
18 .input_output_types(vec![(Type::Nothing, Type::Nothing)])
19 .optional("name", SyntaxShape::String, "Overlay to hide.")
20 .switch(
21 "keep-custom",
22 "Keep all newly added commands and aliases in the next activated overlay.",
23 Some('k'),
24 )
25 .named(
26 "keep-env",
27 SyntaxShape::List(Box::new(SyntaxShape::String)),
28 "List of environment variables to keep in the next activated overlay",
29 Some('e'),
30 )
31 .category(Category::Core)
32 }
33
34 fn extra_description(&self) -> &str {
35 r#"This command is a parser keyword. For details, check:
36 https://www.nushell.sh/book/thinking_in_nu.html"#
37 }
38
39 fn command_type(&self) -> CommandType {
40 CommandType::Keyword
41 }
42
43 fn run(
44 &self,
45 engine_state: &EngineState,
46 stack: &mut Stack,
47 call: &Call,
48 _input: PipelineData,
49 ) -> Result<PipelineData, ShellError> {
50 let overlay_name: Spanned<String> = if let Some(name) = call.opt(engine_state, stack, 0)? {
51 name
52 } else {
53 Spanned {
54 item: stack.last_overlay_name()?,
55 span: call.head,
56 }
57 };
58
59 if !stack.is_overlay_active(&overlay_name.item) {
60 return Err(ShellError::OverlayNotFoundAtRuntime {
61 overlay_name: overlay_name.item,
62 span: overlay_name.span,
63 });
64 }
65
66 let keep_env: Option<Vec<Spanned<String>>> =
67 call.get_flag(engine_state, stack, "keep-env")?;
68
69 let env_vars_to_keep = if let Some(env_var_names_to_keep) = keep_env {
70 let mut env_vars_to_keep = vec![];
71
72 for name in env_var_names_to_keep.into_iter() {
73 match stack.get_env_var(engine_state, &name.item) {
74 Some(val) => env_vars_to_keep.push((name.item, val.clone())),
75 None => {
76 return Err(ShellError::EnvVarNotFoundAtRuntime {
77 envvar_name: name.item,
78 span: name.span,
79 });
80 }
81 }
82 }
83
84 env_vars_to_keep
85 } else {
86 vec![]
87 };
88
89 let env_vars_to_restore = stack.get_hidden_env_vars(&overlay_name.item, engine_state);
91 stack.remove_overlay(&overlay_name.item);
92 for (name, val) in env_vars_to_restore {
93 stack.add_env_var(name, val);
94 }
95
96 for (name, val) in env_vars_to_keep {
97 stack.add_env_var(name, val);
98 }
99 stack.update_config(engine_state)?;
100 Ok(PipelineData::empty())
101 }
102
103 fn examples(&self) -> Vec<Example<'_>> {
104 vec![
105 Example {
106 description: "Keep a custom command after hiding the overlay",
107 example: r#"module spam { export def foo [] { "foo" } }
108 overlay use spam
109 def bar [] { "bar" }
110 overlay hide spam --keep-custom
111 bar
112 "#,
113 result: None,
114 },
115 Example {
116 description: "Hide an overlay created from a file",
117 example: r#"'export alias f = "foo"' | save spam.nu
118 overlay use spam.nu
119 overlay hide spam"#,
120 result: None,
121 },
122 Example {
123 description: "Hide the last activated overlay",
124 example: r#"module spam { export-env { $env.FOO = "foo" } }
125 overlay use spam
126 overlay hide"#,
127 result: None,
128 },
129 Example {
130 description: "Keep the current working directory when removing an overlay",
131 example: r#"overlay new spam
132 cd some-dir
133 overlay hide --keep-env [ PWD ] spam"#,
134 result: None,
135 },
136 ]
137 }
138}