nu_command/system/
uname.rs1use 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 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 let _ = localized_help_template("uname");
37
38 let span = call.head;
39 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}