chorus/src/limit.rs

74 lines
2.2 KiB
Rust
Raw Normal View History

use reqwest::{Client, Request};
2023-04-07 21:51:50 +02:00
use std::collections::VecDeque;
2023-04-08 14:51:36 +02:00
// Note: There seem to be some overlapping request limiters. We need to make sure that sending a
// request checks for all the request limiters that apply, and blocks if any of the limiters are 0
pub struct Limit {
limit: i64,
remaining: i64,
reset: i64,
bucket: String,
}
2023-04-07 21:51:50 +02:00
pub struct LimitedRequester {
http: Client,
limit: Vec<Limit>,
requests: VecDeque<Request>,
}
2023-04-07 21:51:50 +02:00
impl LimitedRequester {
/// Create a new `LimitedRequester`. `LimitedRequester`s use a `VecDeque` to store requests and
/// send them to the server using a `Client`. It keeps track of the remaining requests that can
/// be send within the `Limit` of an external API Ratelimiter, and looks at the returned request
/// headers to see if it can find Ratelimit info to update itself.
2023-04-08 14:51:36 +02:00
pub async fn new(api_url: String) -> Self {
2023-04-07 21:51:50 +02:00
LimitedRequester {
2023-04-08 14:51:36 +02:00
limit: LimitedRequester::check_limits(api_url).await,
http: Client::new(),
2023-04-07 21:51:50 +02:00
requests: VecDeque::new(),
}
}
2023-04-08 14:51:36 +02:00
pub async fn check_limits(url: String) -> Vec<Limit> {
let client = Client::new();
let url_parsed = crate::URLBundle::parse_url(url) + "/api/policies/instance/limits";
let result = client
.get(url_parsed)
.send()
.await
.unwrap_or_else(|e| panic!("An error occured while performing the request: {}", e))
.text()
.await
.unwrap_or_else(|e| {
panic!(
"An error occured while parsing the request body string: {}",
e
)
});
2023-04-08 14:51:36 +02:00
/*
2. extract rate and absolute rate limits from response result
3. put each different rate limit as a new object in the limit vector
4. yeah
*/
let mut limit_vector = Vec::new();
limit_vector.push(Limit {
limit: -1,
remaining: -1,
reset: -1,
bucket: String::new(),
}); // TODO: Implement
limit_vector
}
}
/* #[cfg(test)] Tests work here as well, neat!
mod tests {
use super::*;
#[test]
fn test_parse_url() {
assert_eq!(1, 1)
}
} */