diff options
author | Cyborus <cyborus@cyborus.xyz> | 2023-12-13 01:50:55 +0100 |
---|---|---|
committer | Cyborus <cyborus@cyborus.xyz> | 2023-12-13 02:06:42 +0100 |
commit | 1a9353c9bfcef94a5bfa870c4cee03e5e9df1648 (patch) | |
tree | 8b5888bedcb7297bd875921dd1aa07c92fdb5942 | |
parent | Merge pull request 'add ci' (#8) from ci into main (diff) | |
download | forgejo-cli-1a9353c9bfcef94a5bfa870c4cee03e5e9df1648.tar.xz forgejo-cli-1a9353c9bfcef94a5bfa870c4cee03e5e9df1648.zip |
add issue search
-rw-r--r-- | src/issues.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/issues.rs b/src/issues.rs index 56ee300..d4eef16 100644 --- a/src/issues.rs +++ b/src/issues.rs @@ -25,6 +25,17 @@ pub enum IssueCommand { #[clap(long, short)] with_msg: Option<Option<String>>, }, + Search { + query: Option<String>, + #[clap(long, short)] + labels: Option<String>, + #[clap(long, short)] + creator: Option<String>, + #[clap(long, short)] + assignee: Option<String>, + #[clap(long, short)] + state: Option<State>, + }, 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<State> 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,7 @@ 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 +154,37 @@ async fn view_issue(repo: &RepoInfo, api: &Forgejo, id: u64) -> eyre::Result<()> } Ok(()) } +async fn view_issues( + repo: &RepoInfo, + api: &Forgejo, + query_str: Option<String>, + labels: Option<String>, + creator: Option<String>, + assignee: Option<String>, + state: Option<State> +) -> eyre::Result<()> { + let labels = labels.map(|s| s.split(',').map(|s| s.to_string()).collect::<Vec<_>>()).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 |