github-client 0.1.0

Github Client
use super::{GenericResponse, Result, BASE_URL};
use crate::payload::{PullRequestCommitPayload, PullRequestPayload, SearchPayload};
use reqwest::Client;

pub struct PullRequestClient<'a> {
    pub(super) client: &'a Client,
}

impl<'a> PullRequestClient<'a> {
    pub fn create(&self, repository_name: &str, body: String) -> Result<PullRequestPayload> {
        let mut response = self
            .client
            .post(&format!("{}repos/{}/pulls", BASE_URL, repository_name,))
            .body(body)
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response.json().unwrap())
    }

    pub fn update(
        &self,
        repository_name: &str,
        pull_request_number: u64,
        body: String,
    ) -> GenericResponse {
        let mut response = self
            .client
            .patch(&format!(
                "{}repos/{}/pulls/{}",
                BASE_URL, repository_name, pull_request_number,
            ))
            .body(body)
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response)
    }

    pub fn merge(
        &self,
        repository_name: &str,
        pull_request_number: u64,
        body: String,
    ) -> GenericResponse {
        let mut response = self
            .client
            .put(&format!(
                "{}repos/{}/pulls/{}/merge",
                BASE_URL, repository_name, pull_request_number,
            ))
            .body(body)
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response)
    }

    pub fn get(
        &self,
        repository_name: &str,
        pull_request_number: u64,
    ) -> Result<PullRequestPayload> {
        let mut response = self
            .client
            .get(&format!(
                "{}repos/{}/pulls/{}",
                BASE_URL, repository_name, pull_request_number,
            ))
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response.json().unwrap())
    }

    pub fn commits(
        &self,
        repository_name: &str,
        pull_request_number: u64,
    ) -> Result<Vec<PullRequestCommitPayload>> {
        let mut response = self
            .client
            .get(&format!(
                "{}repos/{}/pulls/{}/commits",
                BASE_URL, repository_name, pull_request_number,
            ))
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response.json().unwrap())
    }

    pub fn approve(&self, repository_name: &str, pull_request_number: u64) -> GenericResponse {
        let mut response = self
            .client
            .post(&format!(
                "{}repos/{}/pulls/{}/reviews",
                BASE_URL, repository_name, pull_request_number,
            ))
            .body(
                json!({
                    "event": "APPROVE",
                })
                .to_string(),
            )
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response)
    }

    pub fn all(&self, repository_name: &str) -> Result<Vec<PullRequestPayload>> {
        let mut response = self
            .client
            .get(&format!("{}repos/{}/pulls", BASE_URL, repository_name,))
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response.json().unwrap())
    }

    pub fn search(&self, repository_name: &str, term: &str) -> Result<SearchPayload> {
        let mut response = self
            .client
            .get(&format!(
                "{}search/issues?q={}+is:pr+repo:{}",
                BASE_URL, term, repository_name,
            ))
            .send()
            .unwrap();

        if !response.status().is_success() {
            return Err(response.json().unwrap());
        }

        Ok(response.json().unwrap())
    }
}