//! `repo-labels [pattern]` — list the active repo's full label set //! (project-wide), not the labels on one issue/PR (that's `labels //! `). Useful for triage / labelling to discover the valid label //! names + what each means before applying them. use anyhow::Result; use clap::Args as ClapArgs; use forgejo_api::structs::Label; use crate::client::Client; use crate::verbs::{labels, print_json}; #[derive(ClapArgs)] pub struct Args { /// Substring pattern to filter label names (case-sensitive). pattern: Option, } pub fn run(client: &Client, args: Args) -> Result<()> { let labels = labels::repo_labels(client)?; let filtered: Vec<&Label> = labels .iter() .filter(|l| { let label_name = l.name.as_deref().unwrap_or_default(); args.pattern .as_deref() .is_none_or(|p| label_name.contains(p)) }) .collect(); if client.json_mode() { // Full label objects (id, name, color, description) as a JSON array. print_json(&serde_json::to_value(&filtered)?)?; } else { // One label per line: `name`, plus its description (tab-separated) // when set, so triage can see what each label means at a glance. for l in filtered { let label_name = l.name.as_deref().unwrap_or_default(); let desc = l.description.as_deref().unwrap_or_default(); if desc.is_empty() { println!("{label_name}"); } else { println!("{label_name}\t{desc}"); } } } Ok(()) }