Documentation
pub mod dto;

pub use dto::*;

use http::Method;
use reqwest::Client;
use url::Url;

use crate::{client::resp_json, Result};

pub fn oauth2_url(
    base_url: &str,
    client_id: &str,
    redirect_uri: &str,
    response_type: &str,
    state: &str,
) -> Result<Url> {
    let mut url = Url::parse(base_url)?.join("login/oauth/authorize")?;
    url.query_pairs_mut()
        .append_pair("client_id", client_id)
        .append_pair("redirect_uri", redirect_uri)
        .append_pair("response_type", response_type)
        .append_pair("state", state);

    Ok(url)
}

pub async fn access_token(
    base_url: &str,
    ac_form: AccessTokenForm,
    http_cli: Client,
) -> Result<AccessToken> {
    let url = Url::parse(base_url)?.join("login/oauth/access_token")?;

    let resp = http_cli
        .request(Method::POST, url)
        .json(&ac_form)
        .send()
        .await?;

    resp_json(resp, "get access_token failed").await
}