summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyborus <cyborus@cyborus.xyz>2023-12-13 01:50:55 +0100
committerCyborus <cyborus@cyborus.xyz>2023-12-13 02:06:42 +0100
commit1a9353c9bfcef94a5bfa870c4cee03e5e9df1648 (patch)
tree8b5888bedcb7297bd875921dd1aa07c92fdb5942
parentMerge pull request 'add ci' (#8) from ci into main (diff)
downloadforgejo-cli-1a9353c9bfcef94a5bfa870c4cee03e5e9df1648.tar.xz
forgejo-cli-1a9353c9bfcef94a5bfa870c4cee03e5e9df1648.zip
add issue search
-rw-r--r--src/issues.rs58
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