Skip to content

Commit

Permalink
Feature: add list command
Browse files Browse the repository at this point in the history
  • Loading branch information
jullanggit committed Feb 12, 2025
1 parent b197ee7 commit 240e4fc
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 22 deletions.
2 changes: 2 additions & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ pub enum Commands {
Build,
/// Print the difference between the system and the config
Diff,
/// Prints the currently active system config
List,
/// Upgrade all managers
Upgrade,
}
70 changes: 48 additions & 22 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use anyhow::{Context as _, anyhow};
use clap::Parser as _;
use cli::{
Cli,
Commands::{Build, Diff, Upgrade},
Commands::{Build, Diff, List, Upgrade},
};
use colored::Colorize as _;
use serde::Deserialize;
Expand Down Expand Up @@ -62,9 +62,31 @@ fn main() -> anyhow::Result<()> {
let mut managers =
load_managers(cli.managers, cli.non_specified).context("Failed to load managers")?;
match cli.command {
Build | Diff => {
Build | Diff | List => {
load_configs(&mut managers).context("Failed to load configs")?;

if cli.command == List {
for manager in managers {
// Get system items
let system_items = system_items(&manager).with_context(|| {
format!("Failed to get system items for manager '{}'", manager.name)
})?;

if !system_items.is_empty() {
// Print manager name
println!("{}:", manager.name.bold());

// Print items
for item in system_items {
println!("{item}");
}
println!();
}
}
// Return early
return Ok(());
}

compute_add_remove(&mut managers).context("Failed to compute add/remove")?;

print_diff(&managers);
Expand Down Expand Up @@ -226,26 +248,7 @@ fn load_configs(managers: &mut [Manager]) -> anyhow::Result<()> {
fn compute_add_remove(managers: &mut [Manager]) -> anyhow::Result<()> {
for manager in managers {
// Get system items
let items_separator = manager.items_separator.as_deref().unwrap_or(" ");
let outputs: Vec<String> = fmt_command(
&manager.list,
manager.items.iter().map(String::as_str),
items_separator,
true,
)?
.into_iter()
.map(run_command_with_output)
.try_collect()?;

// Cant get this to work without collecting first
let system_items_string: String =
outputs.into_iter().intersperse("\n".to_owned()).collect();

let system_items = system_items_string
.split('\n')
.filter(|item| !item.is_empty())
.map(str::to_string)
.collect();
let system_items = system_items(manager)?;

manager.items_to_add = manager
.items
Expand All @@ -260,6 +263,29 @@ fn compute_add_remove(managers: &mut [Manager]) -> anyhow::Result<()> {
Ok(())
}

/// Gets the list of items on the system
fn system_items(manager: &Manager) -> Result<HashSet<String>, anyhow::Error> {
let items_separator = manager.items_separator.as_deref().unwrap_or(" ");
let outputs: Vec<String> = fmt_command(
&manager.list,
manager.items.iter().map(String::as_str),
items_separator,
true,
)?
.into_iter()
.map(run_command_with_output)
.try_collect()?;

// Cant get this to work without collecting first
let system_items_string: String = outputs.into_iter().intersperse("\n".to_owned()).collect();

Ok(system_items_string
.split('\n')
.filter(|item| !item.is_empty())
.map(str::to_string)
.collect())
}

/// Prints all items to remove/add
fn print_diff(managers: &[Manager]) {
for manager in managers {
Expand Down

0 comments on commit 240e4fc

Please sign in to comment.