atcoder-kit 0.2.0

A command-line tool for AtCoder like acc and oj.
Documentation
use reqwest::{Client, Request, Response, redirect::Policy};
use reqwest_middleware::{ClientWithMiddleware, Middleware, Next, Result as MiddlewareResult};
use std::time::Duration;
use tokio::time::sleep;

struct SleepMiddleware(Duration);

#[async_trait::async_trait]
impl Middleware for SleepMiddleware {
    async fn handle(
        &self,
        request: Request,
        extensions: &mut http::Extensions,
        next: Next<'_>,
    ) -> MiddlewareResult<Response> {
        sleep(self.0).await;
        next.run(request, extensions).await
    }
}

pub(crate) fn build_client() -> reqwest::Result<ClientWithMiddleware> {
    let client = Client::builder()
        .cookie_store(true)
        .redirect(Policy::none())
        .user_agent(format!("AtCoder-Kit/{}", env!("CARGO_PKG_VERSION")))
        .build()?;

    Ok(reqwest_middleware::ClientBuilder::new(client)
        .with(SleepMiddleware(Duration::from_millis(250)))
        .build())
}