summaryrefslogtreecommitdiff
path: root/crates/nixpkgs-tracker-http/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/nixpkgs-tracker-http/src')
-rw-r--r--crates/nixpkgs-tracker-http/src/github.rs40
-rw-r--r--crates/nixpkgs-tracker-http/src/lib.rs28
-rw-r--r--crates/nixpkgs-tracker-http/src/model.rs19
-rw-r--r--crates/nixpkgs-tracker-http/src/teawie.rs30
4 files changed, 117 insertions, 0 deletions
diff --git a/crates/nixpkgs-tracker-http/src/github.rs b/crates/nixpkgs-tracker-http/src/github.rs
new file mode 100644
index 0000000..12ee832
--- /dev/null
+++ b/crates/nixpkgs-tracker-http/src/github.rs
@@ -0,0 +1,40 @@
+use super::{Error, PullRequest};
+
+use std::future::Future;
+
+use log::trace;
+
+const GITHUB_API: &str = "https://api.github.com";
+
+pub trait Ext {
+ /// GET `/repos/{repo_owner}/{repo_name}/pulls/{id}`
+ ///
+ /// # Errors
+ ///
+ /// Will return [`Err`] if the merge commit cannot be found
+ fn pull_request(
+ &self,
+ repo_owner: &str,
+ repo_name: &str,
+ id: u64,
+ ) -> impl Future<Output = Result<PullRequest, Error>> + Send;
+}
+
+impl Ext for super::Client {
+ async fn pull_request(
+ &self,
+ repo_owner: &str,
+ repo_name: &str,
+ id: u64,
+ ) -> Result<PullRequest, Error> {
+ let url = format!("{GITHUB_API}/repos/{repo_owner}/{repo_name}/pulls/{id}");
+
+ let request = self.get(&url).build()?;
+ trace!("Making GET request to `{}`", request.url());
+ let response = self.execute(request).await?;
+ response.error_for_status_ref()?;
+ let pull_request: PullRequest = response.json().await?;
+
+ Ok(pull_request)
+ }
+}
diff --git a/crates/nixpkgs-tracker-http/src/lib.rs b/crates/nixpkgs-tracker-http/src/lib.rs
new file mode 100644
index 0000000..873ebb8
--- /dev/null
+++ b/crates/nixpkgs-tracker-http/src/lib.rs
@@ -0,0 +1,28 @@
+mod github;
+mod model;
+mod teawie;
+
+pub use github::Ext as GitHubClientExt;
+pub use model::*;
+pub use teawie::Ext as TeawieClientExt;
+
+pub type Client = reqwest::Client;
+pub type Error = reqwest::Error;
+
+/// Fun trait for functions we use with [Client]
+pub trait Ext {
+ fn default() -> Self;
+}
+
+impl Ext for Client {
+ /// Create the default [`Client`]
+ fn default() -> Self {
+ reqwest::Client::builder()
+ .user_agent(format!(
+ "nixpkgs-tracker-bot/{}",
+ option_env!("CARGO_PKG_VERSION").unwrap_or_else(|| "development")
+ ))
+ .build()
+ .unwrap()
+ }
+}
diff --git a/crates/nixpkgs-tracker-http/src/model.rs b/crates/nixpkgs-tracker-http/src/model.rs
new file mode 100644
index 0000000..9439538
--- /dev/null
+++ b/crates/nixpkgs-tracker-http/src/model.rs
@@ -0,0 +1,19 @@
+use serde::Deserialize;
+
+/// Bad version of `/repos/{owner}/{repo}/pulls/{pull_number}` for Github's api
+#[derive(Clone, Debug, Deserialize)]
+pub struct PullRequest {
+ pub html_url: String,
+ pub number: u64,
+ pub title: String,
+ pub merged: bool,
+ pub merged_at: Option<String>,
+ pub merge_commit_sha: Option<String>,
+}
+
+/// `/random_teawie` for the teawieAPI
+#[derive(Clone, Debug, Deserialize)]
+pub struct RandomTeawie {
+ pub url: Option<String>,
+ pub error: Option<String>,
+}
diff --git a/crates/nixpkgs-tracker-http/src/teawie.rs b/crates/nixpkgs-tracker-http/src/teawie.rs
new file mode 100644
index 0000000..97af63c
--- /dev/null
+++ b/crates/nixpkgs-tracker-http/src/teawie.rs
@@ -0,0 +1,30 @@
+use crate::{Error, RandomTeawie};
+
+use std::future::Future;
+
+use log::trace;
+
+const TEAWIE_API: &str = "https://api.getchoo.com";
+
+pub trait Ext {
+ /// Get a random teawie
+ ///
+ /// # Errors
+ ///
+ /// Will return [`Err`] if the request fails or the response cannot be deserialized
+ fn random_teawie(&self) -> impl Future<Output = Result<RandomTeawie, Error>> + Send;
+}
+
+impl Ext for super::Client {
+ async fn random_teawie(&self) -> Result<RandomTeawie, Error> {
+ let url = format!("{TEAWIE_API}/random_teawie");
+
+ let request = self.get(&url).build()?;
+ trace!("Making GET request to {}", request.url());
+ let response = self.execute(request).await?;
+ response.error_for_status_ref()?;
+ let random_teawie: RandomTeawie = response.json().await?;
+
+ Ok(random_teawie)
+ }
+}