nu_command/experimental/
job_list.rs

1use nu_engine::command_prelude::*;
2use nu_protocol::engine::{FrozenJob, Job};
3
4#[derive(Clone)]
5pub struct JobList;
6
7impl Command for JobList {
8    fn name(&self) -> &str {
9        "job list"
10    }
11
12    fn description(&self) -> &str {
13        "List background jobs."
14    }
15
16    fn signature(&self) -> nu_protocol::Signature {
17        Signature::build("job list")
18            .category(Category::Experimental)
19            .input_output_types(vec![(Type::Nothing, Type::table())])
20    }
21
22    fn search_terms(&self) -> Vec<&str> {
23        vec!["background", "jobs"]
24    }
25
26    fn run(
27        &self,
28        engine_state: &EngineState,
29        _stack: &mut Stack,
30        call: &Call,
31        _input: PipelineData,
32    ) -> Result<PipelineData, ShellError> {
33        let head = call.head;
34
35        let jobs = engine_state.jobs.lock().expect("jobs lock is poisoned!");
36
37        let values = jobs
38            .iter()
39            .map(|(id, job)| {
40                let mut record = record! {
41                    "id" => Value::int(id.get() as i64, head),
42                    "type" => match job {
43                        Job::Thread(_) => Value::string("thread", head),
44                        Job::Frozen(_) => Value::string("frozen", head),
45                    },
46                    "pids" => match job {
47                        Job::Thread(job) => Value::list(
48                            job.collect_pids()
49                                .into_iter()
50                                .map(|it| Value::int(it as i64, head))
51                                .collect::<Vec<Value>>(),
52                            head,
53                        ),
54
55                        Job::Frozen(FrozenJob { unfreeze, .. }) => {
56                            Value::list(vec![ Value::int(unfreeze.pid() as i64, head) ], head)
57                        }
58                    },
59                };
60
61                if let Some(tag) = job.tag() {
62                    record.push("tag", Value::string(tag, head));
63                }
64
65                Value::record(record, head)
66            })
67            .collect::<Vec<Value>>();
68
69        Ok(Value::list(values, head).into_pipeline_data())
70    }
71
72    fn examples(&self) -> Vec<Example<'_>> {
73        vec![Example {
74            example: "job list",
75            description: "List all background jobs",
76            result: None,
77        }]
78    }
79}