gitea_sdk/api/issues/
create.rs

1use build_it::Builder;
2use serde::Serialize;
3
4use crate::{error::Result, model::issues::Issue};
5
6#[derive(Debug, Clone, Serialize, Builder)]
7#[build_it(into)]
8pub struct CreateIssueBuilder {
9    #[skip]
10    #[serde(skip)]
11    pub owner: String,
12    #[skip]
13    #[serde(skip)]
14    pub repo: String,
15    #[skip]
16    pub title: String,
17
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub assignees: Option<Vec<String>>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub body: Option<String>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub closed: Option<bool>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub due_date: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub labels: Option<Vec<i64>>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub milestone: Option<i64>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[build_it(rename = "refs")]
32    pub r#ref: Option<String>,
33}
34
35impl CreateIssueBuilder {
36    pub fn new(owner: impl ToString, repo: impl ToString, title: impl ToString) -> Self {
37        Self {
38            owner: owner.to_string(),
39            repo: repo.to_string(),
40            title: title.to_string(),
41            assignees: None,
42            body: None,
43            closed: None,
44            due_date: None,
45            labels: None,
46            milestone: None,
47            r#ref: None,
48        }
49    }
50
51    /// Send the request to create the issue.
52    pub async fn send(&self, client: &crate::Client) -> Result<Issue> {
53        // send the request
54        let owner = &self.owner;
55        let repo = &self.repo;
56        let req = client
57            .post(format!("repos/{owner}/{repo}/issues"))
58            .json(self)
59            .build()?;
60        let res = client.make_request(req).await?;
61        client.parse_response(res).await
62    }
63}