use clap_complete::engine::{ArgValueCandidates, CompletionCandidate};
use padzapp::api::{PadFilter, PadStatusFilter, PadzApi};
use padzapp::init::initialize;
use padzapp::store::fs::FileStore;
use std::path::PathBuf;
fn get_pad_candidates(include_deleted: bool) -> Vec<CompletionCandidate> {
let args: Vec<String> = std::env::args().collect();
let is_global = args.iter().any(|a| a == "-g" || a == "--global");
let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
let ctx = initialize(&cwd, is_global);
let api: PadzApi<FileStore> = ctx.api;
let filter = PadFilter {
status: if include_deleted {
PadStatusFilter::All
} else {
PadStatusFilter::Active
},
search_term: None,
todo_status: None,
};
let Ok(result) = api.get_pads(ctx.scope, filter) else {
return vec![];
};
let mut candidates = Vec::new();
for dp in result.listed_pads {
let index_str = dp.index.to_string();
let title = &dp.pad.metadata.title;
candidates.push(
CompletionCandidate::new(index_str.clone())
.help(Some(title.clone().into()))
.display_order(Some(0)),
);
if title != &index_str {
candidates.push(
CompletionCandidate::new(title.clone())
.help(Some(format!("({})", index_str).into()))
.display_order(Some(1)),
);
}
}
candidates
}
pub fn active_pads_completer() -> ArgValueCandidates {
ArgValueCandidates::new(|| get_pad_candidates(false))
}
pub fn all_pads_completer() -> ArgValueCandidates {
ArgValueCandidates::new(|| get_pad_candidates(true))
}
pub fn deleted_pads_completer() -> ArgValueCandidates {
ArgValueCandidates::new(|| {
let args: Vec<String> = std::env::args().collect();
let is_global = args.iter().any(|a| a == "-g" || a == "--global");
let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
let ctx = initialize(&cwd, is_global);
let api: PadzApi<FileStore> = ctx.api;
let filter = PadFilter {
status: PadStatusFilter::Deleted,
search_term: None,
todo_status: None,
};
let Ok(result) = api.get_pads(ctx.scope, filter) else {
return vec![];
};
result
.listed_pads
.into_iter()
.map(|dp| {
let index_str = dp.index.to_string();
CompletionCandidate::new(index_str)
.help(Some(dp.pad.metadata.title.into()))
.display_order(Some(0))
})
.collect()
})
}