diff options
author | Teddy Wing | 2020-07-28 22:20:36 +0200 |
---|---|---|
committer | Teddy Wing | 2020-07-28 22:20:36 +0200 |
commit | d052c1a9d3f06c32c92d9d36b0baa4cbb4d9c2c3 (patch) | |
tree | a4dfd8d8563e74fbf54dcb73d1e6167b4cce4a96 /src/client.rs | |
parent | 1e2fb780514ff28f136024d362237e5c2038f2cc (diff) | |
download | git-suggestion-d052c1a9d3f06c32c92d9d36b0baa4cbb4d9c2c3.tar.bz2 |
Move `Client` to a new module
Diffstat (limited to 'src/client.rs')
-rw-r--r-- | src/client.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 0000000..d6cf629 --- /dev/null +++ b/src/client.rs @@ -0,0 +1,72 @@ +use github_rs::client::{Executor, Github}; +use serde_json::Value; +use thiserror::Error; + +use crate::suggestion::Suggestion; + + +#[derive(Debug, Error)] +pub enum Error { + #[error("GitHub client error: {0}")] + Github(String), + + #[error("Unable to deserialize")] + Deserialize(#[from] serde_json::error::Error), +} + + +pub struct Client<'a> { + client: Github, + owner: &'a str, + repo: &'a str, +} + +impl<'a> Client<'a> { + pub fn new(token: &str, owner: &'a str, repo: &'a str) -> Self { + let client = Github::new(&token).unwrap(); + + Client { client, owner, repo } + } + + pub fn fetch(&self, id: &str) -> Result<Suggestion, Error> { + let response = self.client + .get() + .repos() + .owner(self.owner) + .repo(self.repo) + .pulls() + .comments() + .id(id) + .execute::<Value>(); + + match response { + Ok((_, _, Some(json))) => { + let suggestion = serde_json::from_value(json)?; + + Ok(suggestion) + }, + Ok((_, _, None)) => Err(Error::Github("no response".to_owned())), + Err(e) => Err(Error::Github(e.to_string())), + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[ignore] + fn suggestion_fetch_gets_pull_request_comment() { + let client = Client::new( + env!("GITHUB_TOKEN"), + "cli", + "cli", + ); + + let suggestion = client.fetch("438947607").unwrap(); + + println!("{:?}", suggestion); + } +} |