nu_cmd_lang/core_commands/overlay/
hide.rs

1use 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        // also restore env vars which has been hidden
90        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}