From fdc1cc7bc3d237ef4976f9f9d2ffc09b7ba164d5 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sat, 1 Aug 2020 15:32:17 +0200 Subject: Move library to a separate crate Keep the binaries in the root crate, and add a new crate for the `github-suggestion` library. I want to add some library code to the CLI programs to extract common functionality between the different binaries. --- github-suggestion/src/client.rs | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 github-suggestion/src/client.rs (limited to 'github-suggestion/src/client.rs') diff --git a/github-suggestion/src/client.rs b/github-suggestion/src/client.rs new file mode 100644 index 0000000..c6ae1f1 --- /dev/null +++ b/github-suggestion/src/client.rs @@ -0,0 +1,58 @@ +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, + ) -> Result { + let client = match Github::new(&token) { + Ok(g) => g, + Err(e) => return Err(Error::Github(e.to_string())), + }; + + Ok(Client { client, owner, repo }) + } + + pub fn fetch(&self, id: &str) -> Result { + let response = self.client + .get() + .repos() + .owner(self.owner) + .repo(self.repo) + .pulls() + .comments() + .id(id) + .execute::(); + + 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())), + } + } +} -- cgit v1.2.3