nu_command/system/
uname.rs

1use nu_engine::command_prelude::*;
2use nu_protocol::{Value, record};
3use uucore::{localized_help_template, translate};
4
5#[derive(Clone)]
6pub struct UName;
7
8impl Command for UName {
9    fn name(&self) -> &str {
10        "uname"
11    }
12
13    fn signature(&self) -> Signature {
14        Signature::build("uname")
15            .input_output_types(vec![(Type::Nothing, Type::table())])
16            .category(Category::System)
17    }
18
19    fn description(&self) -> &str {
20        "Print certain system information using uutils/coreutils uname."
21    }
22
23    fn search_terms(&self) -> Vec<&str> {
24        // add other terms?
25        vec!["system", "coreutils"]
26    }
27
28    fn run(
29        &self,
30        _engine_state: &EngineState,
31        _stack: &mut Stack,
32        call: &Call,
33        _input: PipelineData,
34    ) -> Result<PipelineData, ShellError> {
35        // setup the uutils error translation
36        let _ = localized_help_template("uname");
37
38        let span = call.head;
39        // Simulate `uname -all` is called every time
40        let opts = uu_uname::Options {
41            all: true,
42            kernel_name: false,
43            nodename: false,
44            kernel_release: false,
45            kernel_version: false,
46            machine: false,
47            processor: false,
48            hardware_platform: false,
49            os: false,
50        };
51        let output = uu_uname::UNameOutput::new(&opts).map_err(|e| ShellError::GenericError {
52            error: format!("{e}"),
53            msg: translate!(&e.to_string()),
54            span: None,
55            help: None,
56            inner: Vec::new(),
57        })?;
58        let outputs = [
59            output.kernel_name,
60            output.nodename,
61            output.kernel_release,
62            output.kernel_version,
63            output.machine,
64            output.os,
65        ];
66        let outputs = outputs
67            .iter()
68            .map(|name| {
69                Ok(name
70                    .as_ref()
71                    .ok_or("unknown")
72                    .map_err(|_| ShellError::NotFound { span })?
73                    .to_string())
74            })
75            .collect::<Result<Vec<String>, ShellError>>()?;
76        Ok(PipelineData::value(
77            Value::record(
78                record! {
79                    "kernel-name" => Value::string(outputs[0].clone(), span),
80                    "nodename" => Value::string(outputs[1].clone(), span),
81                    "kernel-release" => Value::string(outputs[2].clone(), span),
82                    "kernel-version" => Value::string(outputs[3].clone(), span),
83                    "machine" => Value::string(outputs[4].clone(), span),
84                    "operating-system" => Value::string(outputs[5].clone(), span),
85                },
86                span,
87            ),
88            None,
89        ))
90    }
91
92    fn examples(&self) -> Vec<Example<'_>> {
93        vec![Example {
94            description: "Print all information",
95            example: "uname",
96            result: None,
97        }]
98    }
99}