From bd5608a1de94bbfacfaa19554b6f054b9c491780 Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Mon, 15 Jul 2024 13:28:16 +0100 Subject: [PATCH] Move API client to its own file --- src/main.rs | 53 ++--------------------------------------------- src/toggl/mod.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 51 deletions(-) create mode 100644 src/toggl/mod.rs diff --git a/src/main.rs b/src/main.rs index 82572c5..7121248 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,55 +1,6 @@ -use std::num::NonZero; -use std::time::Duration; -use axum::async_trait; -use governor::clock::DefaultClock; -use governor::state::{InMemoryState, NotKeyed}; -use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; -use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff, Jitter}; +use toggl::TogglApi; -struct ReqwestRateLimiter { - rate_limiter: governor::RateLimiter, -} - -impl ReqwestRateLimiter { - fn new() -> Self { - Self { - rate_limiter: governor::RateLimiter::direct( - governor::Quota::per_second(NonZero::new(1u32).unwrap()) - ), - } - } -} - -#[async_trait] -impl reqwest_ratelimit::RateLimiter for ReqwestRateLimiter { - async fn acquire_permit(&self) { - self.rate_limiter.until_ready().await; - } -} - -struct TogglApi { - client: ClientWithMiddleware, - api_key: String, - workspace_id: u32, -} - -impl TogglApi { - fn new(api_key: String, workspace_id: u32) -> Self { - let rate_limiter = ReqwestRateLimiter::new(); - let backoff = ExponentialBackoff::builder() - .retry_bounds(Duration::from_secs(1), Duration::from_secs(60)) - .jitter(Jitter::Bounded) - .base(2) - .build_with_total_retry_duration(Duration::from_secs(24 * 60 * 60)); - - let client = ClientBuilder::new(reqwest::Client::new()) - .with(reqwest_ratelimit::all(rate_limiter)) - .with(RetryTransientMiddleware::new_with_policy(backoff)) - .build(); - - Self { client, api_key, workspace_id } - } -} +mod toggl; #[tokio::main] async fn main() { diff --git a/src/toggl/mod.rs b/src/toggl/mod.rs new file mode 100644 index 0000000..d6b7bdd --- /dev/null +++ b/src/toggl/mod.rs @@ -0,0 +1,54 @@ +use reqwest_retry::policies::ExponentialBackoff; +use std::time::Duration; +use reqwest_retry::{Jitter, RetryTransientMiddleware}; +use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; +use std::num::NonZero; +use axum::async_trait; +use governor::state::{InMemoryState, NotKeyed}; +use governor::clock::DefaultClock; + +struct ReqwestRateLimiter { + rate_limiter: governor::RateLimiter, +} + +impl ReqwestRateLimiter { + fn new() -> Self { + Self { + rate_limiter: governor::RateLimiter::direct( + governor::Quota::per_second(NonZero::new(1u32).unwrap()) + ), + } + } +} + +#[async_trait] +impl reqwest_ratelimit::RateLimiter for ReqwestRateLimiter { + async fn acquire_permit(&self) { + self.rate_limiter.until_ready().await; + } +} + +#[derive(Clone)] +pub struct TogglApi { + client: ClientWithMiddleware, + api_key: String, + workspace_id: u32, +} + +impl TogglApi { + pub fn new(api_key: String, workspace_id: u32) -> Self { + let rate_limiter = ReqwestRateLimiter::new(); + let backoff = ExponentialBackoff::builder() + .retry_bounds(Duration::from_secs(1), Duration::from_secs(60)) + .jitter(Jitter::Bounded) + .base(2) + .build_with_total_retry_duration(Duration::from_secs(24 * 60 * 60)); + + let client = ClientBuilder::new(reqwest::Client::new()) + .with(reqwest_ratelimit::all(rate_limiter)) + .with(RetryTransientMiddleware::new_with_policy(backoff)) + .build(); + + Self { client, api_key, workspace_id } + } +}