Skip to main content

browser_control/cli/
list.rs

1//! `list-installed` and `list-running` subcommand handlers.
2
3use anyhow::Result;
4
5use crate::cli::output::{print_json, print_table};
6use crate::detect;
7use crate::registry::Registry;
8
9/// Implements `browser-control list-installed [--json]`.
10pub fn run_list_installed(json: bool) -> Result<()> {
11    let installed = detect::list_installed();
12    if json {
13        print_json(&mut std::io::stdout(), &installed)?;
14    } else {
15        let headers = ["KIND", "VERSION", "ENGINE", "EXECUTABLE"];
16        let rows = installed
17            .iter()
18            .map(|i| {
19                vec![
20                    i.kind.as_str().to_string(),
21                    i.version.clone(),
22                    format!("{:?}", i.engine).to_lowercase(),
23                    i.executable.display().to_string(),
24                ]
25            })
26            .collect::<Vec<_>>();
27        print_table(&mut std::io::stdout(), &headers, &rows)?;
28    }
29    Ok(())
30}
31
32/// Implements `browser-control list-running [--json]`.
33pub fn run_list_running(json: bool) -> Result<()> {
34    let reg = Registry::open()?;
35    let alive = reg.list_alive()?;
36    if json {
37        print_json(&mut std::io::stdout(), &alive)?;
38    } else {
39        let headers = [
40            "NAME", "KIND", "PID", "ENGINE", "ENDPOINT", "PROFILE", "STARTED",
41        ];
42        let rows = alive
43            .iter()
44            .map(|r| {
45                vec![
46                    r.name.clone(),
47                    r.kind.as_str().to_string(),
48                    r.pid.to_string(),
49                    format!("{:?}", r.engine).to_lowercase(),
50                    r.endpoint.clone(),
51                    r.profile_dir.display().to_string(),
52                    r.started_at.clone(),
53                ]
54            })
55            .collect::<Vec<_>>();
56        print_table(&mut std::io::stdout(), &headers, &rows)?;
57    }
58    Ok(())
59}