Skip to main content

lux_cli/
list.rs

1use clap::Args;
2use eyre::Result;
3use itertools::Itertools as _;
4use lux_lib::{config::Config, lockfile::PinnedState, lua_version::LuaVersion};
5use text_trees::{FormatCharacters, StringTreeNode, TreeFormatting};
6
7#[derive(Args)]
8pub struct ListCmd {
9    #[arg(long)]
10    porcelain: bool,
11}
12
13/// List rocks that are installed in the user tree
14pub fn list_installed(list_data: ListCmd, config: Config) -> Result<()> {
15    let tree = config.user_tree(LuaVersion::from(&config)?.clone())?;
16    let available_rocks = tree.list()?;
17
18    if list_data.porcelain {
19        println!("{}", serde_json::to_string(&available_rocks)?);
20    } else {
21        let formatting = TreeFormatting::dir_tree(FormatCharacters::box_chars());
22        for (name, packages) in available_rocks.into_iter().sorted() {
23            let mut tree = StringTreeNode::new(name.to_string());
24
25            for package in packages {
26                tree.push(format!(
27                    "{}{}",
28                    package.version(),
29                    if package.pinned() == PinnedState::Pinned {
30                        " (pinned)"
31                    } else {
32                        ""
33                    }
34                ));
35            }
36
37            println!("{}", tree.to_string_with_format(&formatting)?);
38        }
39    }
40
41    Ok(())
42}