aboutsummaryrefslogtreecommitdiffstats
path: root/src/client.rs
diff options
context:
space:
mode:
authorTeddy Wing2020-07-28 22:20:36 +0200
committerTeddy Wing2020-07-28 22:20:36 +0200
commitd052c1a9d3f06c32c92d9d36b0baa4cbb4d9c2c3 (patch)
treea4dfd8d8563e74fbf54dcb73d1e6167b4cce4a96 /src/client.rs
parent1e2fb780514ff28f136024d362237e5c2038f2cc (diff)
downloadgit-suggestion-d052c1a9d3f06c32c92d9d36b0baa4cbb4d9c2c3.tar.bz2
Move `Client` to a new module
Diffstat (limited to 'src/client.rs')
-rw-r--r--src/client.rs72
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);
+ }
+}