diff --git a/src/issues.rs b/src/issues.rs index 56ee300..13f9590 100644 --- a/src/issues.rs +++ b/src/issues.rs @@ -25,6 +25,17 @@ pub enum IssueCommand { #[clap(long, short)] with_msg: Option>, }, + Search { + query: Option, + #[clap(long, short)] + labels: Option, + #[clap(long, short)] + creator: Option, + #[clap(long, short)] + assignee: Option, + #[clap(long, short)] + state: Option, + }, View { id: u64, #[clap(subcommand)] @@ -35,6 +46,21 @@ pub enum IssueCommand { }, } +#[derive(clap::ValueEnum, Clone, Copy, Debug)] +pub enum State { + Open, + Closed, +} + +impl From for forgejo_api::State { + fn from(value: State) -> Self { + match value { + State::Open => forgejo_api::State::Open, + State::Closed => forgejo_api::State::Closed, + } + } +} + #[derive(Subcommand, Clone, Debug)] pub enum EditCommand { Title { @@ -68,6 +94,13 @@ impl IssueCommand { ViewCommand::Comment { idx } => view_comment(&repo, &api, id, idx).await?, ViewCommand::Comments => view_comments(&repo, &api, id).await?, }, + Search { + query, + labels, + creator, + assignee, + state, + } => view_issues(&repo, &api, query, labels, creator, assignee, state).await?, Edit { issue, command } => match command { EditCommand::Title { new_title } => { edit_title(&repo, &api, issue, new_title).await? @@ -127,6 +160,42 @@ async fn view_issue(repo: &RepoInfo, api: &Forgejo, id: u64) -> eyre::Result<()> } Ok(()) } +async fn view_issues( + repo: &RepoInfo, + api: &Forgejo, + query_str: Option, + labels: Option, + creator: Option, + assignee: Option, + state: Option, +) -> eyre::Result<()> { + let labels = labels + .map(|s| s.split(',').map(|s| s.to_string()).collect::>()) + .unwrap_or_default(); + let query = forgejo_api::IssueQuery { + query: query_str, + labels, + created_by: creator, + assigned_by: assignee, + state: state.map(|s| s.into()), + ..Default::default() + }; + let issues = api + .get_repo_issues(repo.owner(), repo.name(), query) + .await?; + if issues.len() == 1 { + println!("1 issue"); + } else { + println!("{} issues", issues.len()); + } + for issue in issues { + println!( + "#{}: {} (by {})", + issue.number, issue.title, issue.user.login + ); + } + Ok(()) +} async fn view_comment(repo: &RepoInfo, api: &Forgejo, id: u64, idx: usize) -> eyre::Result<()> { let comments = api