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
13pub 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}