use crate::github::{error::GitHubError, util::spawn_task};
use crate::runtime::AsyncTask;
use octocrab::{Octocrab, models::IssueState, models::issues::Issue};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct UpdateIssueRequest {
pub owner: String,
pub repo: String,
pub issue_number: u64,
pub title: Option<String>,
pub body: Option<String>,
pub state: Option<IssueState>,
pub labels: Option<Vec<String>>,
pub assignees: Option<Vec<String>>,
pub milestone: Option<u64>,
}
pub(crate) fn update_issue(
inner: Arc<Octocrab>,
request: UpdateIssueRequest,
) -> AsyncTask<Result<Issue, GitHubError>> {
spawn_task(async move {
let handler = inner.issues(&request.owner, &request.repo);
let mut req = handler.update(request.issue_number);
if let Some(ref t) = request.title {
req = req.title(t.as_str());
}
if let Some(ref b) = request.body {
req = req.body(b.as_str());
}
if let Some(s) = request.state {
req = req.state(s);
}
if let Some(ref lbs) = request.labels {
req = req.labels(lbs.as_slice());
}
if let Some(ref asgs) = request.assignees {
req = req.assignees(asgs.as_slice());
}
if let Some(ms) = request.milestone {
req = req.milestone(ms);
}
req.send().await.map_err(GitHubError::from)
})
}