refactor(hive-forge): port CLI verbs to forgejo-api
This commit is contained in:
parent
b8a3927c43
commit
4636987469
36 changed files with 1463 additions and 1153 deletions
|
|
@ -1,12 +1,17 @@
|
|||
//! `milestone list|create|close` — manage milestones. Default action:
|
||||
//! list.
|
||||
|
||||
use anyhow::Result;
|
||||
use anyhow::{Context, Result};
|
||||
use clap::{Args as ClapArgs, Subcommand};
|
||||
use forgejo_api::structs::{
|
||||
CreateMilestoneOption, EditMilestoneOption, IssueGetMilestonesListQuery,
|
||||
};
|
||||
use serde_json::{Value, json};
|
||||
use time::OffsetDateTime;
|
||||
use time::format_description::well_known::Rfc3339;
|
||||
|
||||
use crate::client::Client;
|
||||
use crate::verbs::print_json;
|
||||
use crate::client::{Client, index};
|
||||
use crate::verbs::{print_json, rfc3339};
|
||||
|
||||
#[derive(ClapArgs)]
|
||||
pub struct Args {
|
||||
|
|
@ -38,52 +43,71 @@ enum Action {
|
|||
}
|
||||
|
||||
pub fn run(client: &Client, args: Args) -> Result<()> {
|
||||
let repo = client.repo();
|
||||
let (owner, name) = client.owner_repo()?;
|
||||
match args.action.unwrap_or(Action::List) {
|
||||
Action::List => {
|
||||
let v = client.get_json(&format!("/repos/{repo}/milestones?state=open&limit=50"))?;
|
||||
let trimmed: Vec<Value> = v
|
||||
.as_array()
|
||||
.map(|a| {
|
||||
a.iter()
|
||||
.map(|m| {
|
||||
json!({
|
||||
"id": m.get("id"),
|
||||
"title": m.get("title"),
|
||||
"open_issues": m.get("open_issues"),
|
||||
"closed_issues": m.get("closed_issues"),
|
||||
"due_on": m.get("due_on"),
|
||||
"description": m.get("description"),
|
||||
})
|
||||
})
|
||||
.collect()
|
||||
let query = IssueGetMilestonesListQuery {
|
||||
state: Some("open".to_owned()),
|
||||
name: None,
|
||||
};
|
||||
let (_, milestones) = client
|
||||
.api()
|
||||
.issue_get_milestones_list(owner, name, query)
|
||||
.page_size(50)
|
||||
.send()?;
|
||||
let trimmed: Vec<Value> = milestones
|
||||
.iter()
|
||||
.map(|m| {
|
||||
json!({
|
||||
"id": m.id,
|
||||
"title": m.title,
|
||||
"open_issues": m.open_issues,
|
||||
"closed_issues": m.closed_issues,
|
||||
"due_on": rfc3339(m.due_on),
|
||||
"description": m.description,
|
||||
})
|
||||
})
|
||||
.unwrap_or_default();
|
||||
.collect();
|
||||
print_json(&Value::Array(trimmed))
|
||||
}
|
||||
Action::Create { title, desc, due } => {
|
||||
let mut payload = json!({ "title": title });
|
||||
if let Some(d) = desc.filter(|s| !s.is_empty()) {
|
||||
payload["description"] = Value::String(d);
|
||||
}
|
||||
if let Some(d) = due.filter(|s| !s.is_empty()) {
|
||||
payload["due_on"] = Value::String(format!("{d}T00:00:00Z"));
|
||||
}
|
||||
let resp = client.post_json(&format!("/repos/{repo}/milestones"), &payload)?;
|
||||
let due_on = due
|
||||
.filter(|s| !s.is_empty())
|
||||
.map(|d| {
|
||||
OffsetDateTime::parse(&format!("{d}T00:00:00Z"), &Rfc3339)
|
||||
.with_context(|| format!("milestone create: bad --due date {d:?}"))
|
||||
})
|
||||
.transpose()?;
|
||||
let payload = CreateMilestoneOption {
|
||||
description: desc.filter(|s| !s.is_empty()),
|
||||
due_on,
|
||||
state: None,
|
||||
title: Some(title),
|
||||
};
|
||||
let resp = client
|
||||
.api()
|
||||
.issue_create_milestone(owner, name, payload)
|
||||
.send()?;
|
||||
print_json(&json!({
|
||||
"id": resp.get("id"),
|
||||
"title": resp.get("title"),
|
||||
"id": resp.id,
|
||||
"title": resp.title,
|
||||
}))
|
||||
}
|
||||
Action::Close { id } => {
|
||||
let resp = client.patch_json(
|
||||
&format!("/repos/{repo}/milestones/{id}"),
|
||||
&json!({ "state": "closed" }),
|
||||
)?;
|
||||
let payload = EditMilestoneOption {
|
||||
description: None,
|
||||
due_on: None,
|
||||
state: Some("closed".to_owned()),
|
||||
title: None,
|
||||
};
|
||||
let resp = client
|
||||
.api()
|
||||
.issue_edit_milestone(owner, name, index(id)?, payload)
|
||||
.send()?;
|
||||
print_json(&json!({
|
||||
"id": resp.get("id"),
|
||||
"title": resp.get("title"),
|
||||
"state": resp.get("state"),
|
||||
"id": resp.id,
|
||||
"title": resp.title,
|
||||
"state": resp.state,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue