use serde::Serialize;
use crate::packs;
use crate::packs::orchestration::ExecutionContext;
use crate::Result;
#[derive(Debug, Clone, Serialize)]
pub struct ListResult {
pub packs: Vec<ListPack>,
}
#[derive(Debug, Clone, Serialize)]
pub struct ListPack {
pub name: String,
pub ignored: bool,
}
pub fn list(ctx: &ExecutionContext) -> Result<ListResult> {
let root_config = ctx.config_manager.root_config()?;
let scanned = packs::scan_packs(
ctx.fs.as_ref(),
ctx.paths.dotfiles_root(),
&root_config.pack.ignore,
)?;
let mut entries: Vec<(String, ListPack)> = Vec::new();
for p in scanned.packs {
entries.push((
p.name.clone(),
ListPack {
name: p.display_name,
ignored: false,
},
));
}
for dir in scanned.ignored {
let display = packs::display_name_for(&dir).to_string();
entries.push((
dir,
ListPack {
name: display,
ignored: true,
},
));
}
entries.sort_by(|a, b| a.0.cmp(&b.0));
Ok(ListResult {
packs: entries.into_iter().map(|(_, p)| p).collect(),
})
}