nu_cmd_lang/core_commands/
hide_env.rs1use nu_engine::command_prelude::*;
2use nu_protocol::did_you_mean;
3
4#[derive(Clone)]
5pub struct HideEnv;
6
7impl Command for HideEnv {
8 fn name(&self) -> &str {
9 "hide-env"
10 }
11
12 fn signature(&self) -> nu_protocol::Signature {
13 Signature::build("hide-env")
14 .input_output_types(vec![(Type::Nothing, Type::Nothing)])
15 .rest(
16 "name",
17 SyntaxShape::String,
18 "Environment variable names to hide.",
19 )
20 .switch(
21 "ignore-errors",
22 "do not throw an error if an environment variable was not found",
23 Some('i'),
24 )
25 .category(Category::Core)
26 }
27
28 fn description(&self) -> &str {
29 "Hide environment variables in the current scope."
30 }
31
32 fn search_terms(&self) -> Vec<&str> {
33 vec!["unset", "drop"]
34 }
35
36 fn run(
37 &self,
38 engine_state: &EngineState,
39 stack: &mut Stack,
40 call: &Call,
41 _input: PipelineData,
42 ) -> Result<PipelineData, ShellError> {
43 let env_var_names: Vec<Spanned<String>> = call.rest(engine_state, stack, 0)?;
44 let ignore_errors = call.has_flag(engine_state, stack, "ignore-errors")?;
45
46 for name in env_var_names {
47 if !stack.remove_env_var(engine_state, &name.item) && !ignore_errors {
48 let all_names = stack.get_env_var_names(engine_state);
49 if let Some(closest_match) = did_you_mean(&all_names, &name.item) {
50 return Err(ShellError::DidYouMeanCustom {
51 msg: format!("Environment variable '{}' not found", name.item),
52 suggestion: closest_match,
53 span: name.span,
54 });
55 } else {
56 return Err(ShellError::EnvVarNotFoundAtRuntime {
57 envvar_name: name.item,
58 span: name.span,
59 });
60 }
61 }
62 }
63
64 Ok(PipelineData::empty())
65 }
66
67 fn examples(&self) -> Vec<Example<'_>> {
68 vec![Example {
69 description: "Hide an environment variable",
70 example: r#"$env.HZ_ENV_ABC = 1; hide-env HZ_ENV_ABC; 'HZ_ENV_ABC' in $env"#,
71 result: Some(Value::test_bool(false)),
72 }]
73 }
74}