add issue search

This commit is contained in:
Cyborus 2023-12-12 19:50:55 -05:00
parent 98e3cceff8
commit 1a9353c9bf
No known key found for this signature in database

View file

@ -25,6 +25,17 @@ pub enum IssueCommand {
#[clap(long, short)] #[clap(long, short)]
with_msg: Option<Option<String>>, 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 { View {
id: u64, id: u64,
#[clap(subcommand)] #[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)] #[derive(Subcommand, Clone, Debug)]
pub enum EditCommand { pub enum EditCommand {
Title { Title {
@ -68,6 +94,7 @@ impl IssueCommand {
ViewCommand::Comment { idx } => view_comment(&repo, &api, id, idx).await?, ViewCommand::Comment { idx } => view_comment(&repo, &api, id, idx).await?,
ViewCommand::Comments => view_comments(&repo, &api, id).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 { Edit { issue, command } => match command {
EditCommand::Title { new_title } => { EditCommand::Title { new_title } => {
edit_title(&repo, &api, issue, new_title).await? 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(()) 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<()> { async fn view_comment(repo: &RepoInfo, api: &Forgejo, id: u64, idx: usize) -> eyre::Result<()> {
let comments = api let comments = api