aboutsummaryrefslogtreecommitdiffstats
path: root/github-suggestion/src/client.rs
diff options
context:
space:
mode:
authorTeddy Wing2020-08-01 15:32:17 +0200
committerTeddy Wing2020-08-01 15:32:17 +0200
commitfdc1cc7bc3d237ef4976f9f9d2ffc09b7ba164d5 (patch)
tree4dc68f07d4a2e7ad8193f2b5f9a90c9fe6792aec /github-suggestion/src/client.rs
parentb218abebdf8a0aed73bfe6f61ab22e51a0f2f43c (diff)
downloadgit-suggestion-fdc1cc7bc3d237ef4976f9f9d2ffc09b7ba164d5.tar.bz2
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.
Diffstat (limited to 'github-suggestion/src/client.rs')
-rw-r--r--github-suggestion/src/client.rs58
1 files changed, 58 insertions, 0 deletions
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<Self, Error> {
+ 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<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())),
+ }
+ }
+}