nu_command/experimental/
job_list.rs1use 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}