Skip to content

Commit e4f1366

Browse files
committed
Add GitHub issue locking helper
1 parent 742b66b commit e4f1366

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/github.rs

+42
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,18 @@ pub enum ReportedContentClassifiers {
416416
Spam,
417417
}
418418

419+
#[derive(Debug, serde::Deserialize, serde::Serialize, Eq, PartialEq)]
420+
pub enum LockReason {
421+
#[serde(rename = "off-topic")]
422+
OffTopic,
423+
#[serde(rename = "too heated")]
424+
TooHeated,
425+
#[serde(rename = "resolved")]
426+
Resolved,
427+
#[serde(rename = "spam")]
428+
Spam,
429+
}
430+
419431
#[derive(Debug, serde::Deserialize, Eq, PartialEq)]
420432
#[serde(rename_all = "snake_case")]
421433
pub enum PullRequestReviewState {
@@ -855,6 +867,36 @@ impl Issue {
855867
Ok(())
856868
}
857869

870+
/// Lock an issue with an optional reason.
871+
pub async fn lock(
872+
&self,
873+
client: &GithubClient,
874+
reason: Option<LockReason>,
875+
) -> anyhow::Result<()> {
876+
let lock_url = format!(
877+
"{}/issues/{}/lock",
878+
self.repository().url(client),
879+
self.number
880+
);
881+
#[derive(serde::Serialize)]
882+
struct LockReasonIssue {
883+
lock_reason: LockReason,
884+
}
885+
client
886+
.send_req({
887+
let req = client.put(&lock_url);
888+
889+
if let Some(lock_reason) = reason {
890+
req.json(&LockReasonIssue { lock_reason })
891+
} else {
892+
req
893+
}
894+
})
895+
.await
896+
.context("failed to lock issue")?;
897+
Ok(())
898+
}
899+
858900
pub async fn close(&self, client: &GithubClient) -> anyhow::Result<()> {
859901
let edit_url = format!("{}/issues/{}", self.repository().url(client), self.number);
860902
#[derive(serde::Serialize)]

0 commit comments

Comments
 (0)