box-open-sdk 0.3.1

Box API client for Rust (open source, community, punk rock) — typed models, async managers, and a reqwest runtime with retry, backoff, and token refresh.
Documentation
// Code generated by box-gantry. DO NOT EDIT.

use crate::runtime::{self, Error};

/// Optional parameters for [`AuthorizationManager::authorize`].
#[derive(Clone, Debug, Default)]
pub struct AuthorizationAuthorizeOptions {
    pub redirect_uri: Option<String>,
    pub state: Option<String>,
    pub scope: Option<String>,
}

/// Operations for the "authorization" API area.
pub struct AuthorizationManager {
    session: std::sync::Arc<runtime::Client>,
}

impl AuthorizationManager {
    pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
        Self { session }
    }

    pub async fn authorize(
        &self,
        response_type: crate::models::schemas::GetAuthorizeResponseType,
        client_id: String,
        opts: Option<AuthorizationAuthorizeOptions>,
    ) -> Result<String, Error> {
        let mut url = self.session.base_url("oauth_authorize");
        url.push_str("/authorize");
        let mut req = self.session.new_request("GET", &url);
        req = runtime::with_query(req, "response_type", &response_type.0);
        req = runtime::with_query(req, "client_id", &client_id);
        let opts = opts.unwrap_or_default();
        if let Some(value) = opts.redirect_uri {
            req = runtime::with_query(req, "redirect_uri", &value);
        }
        if let Some(value) = opts.state {
            req = runtime::with_query(req, "state", &value);
        }
        if let Some(value) = opts.scope {
            req = runtime::with_query(req, "scope", &value);
        }
        let resp = self.session.fetch(req).await?;
        let data = runtime::response_bytes(&resp)?;
        Ok(String::from_utf8_lossy(&data).into_owned())
    }

    pub async fn create_oauth2_token(
        &self,
        body: crate::models::schemas::PostOAuth2Token,
    ) -> Result<crate::models::schemas::AccessToken, Error> {
        let mut url = self.session.base_url("api_root");
        url.push_str("/oauth2");
        url.push_str("/token");
        let mut req = self.session.new_request("POST", &url);
        let mut form: Vec<(&str, String)> = vec![("grant_type", body.grant_type.0.clone())];
        if let Some(value) = &body.client_id {
            form.push(("client_id", value.clone()));
        }
        if let Some(value) = &body.client_secret {
            form.push(("client_secret", value.clone()));
        }
        if let Some(value) = &body.code {
            form.push(("code", value.clone()));
        }
        if let Some(value) = &body.refresh_token {
            form.push(("refresh_token", value.clone()));
        }
        if let Some(value) = &body.assertion {
            form.push(("assertion", value.clone()));
        }
        if let Some(value) = &body.subject_token {
            form.push(("subject_token", value.clone()));
        }
        if let Some(value) = &body.subject_token_type {
            form.push(("subject_token_type", value.0.clone()));
        }
        if let Some(value) = &body.actor_token {
            form.push(("actor_token", value.clone()));
        }
        if let Some(value) = &body.actor_token_type {
            form.push(("actor_token_type", value.0.clone()));
        }
        if let Some(value) = &body.scope {
            form.push(("scope", value.clone()));
        }
        if let Some(value) = &body.resource {
            form.push(("resource", value.clone()));
        }
        if let Some(value) = &body.box_subject_type {
            form.push(("box_subject_type", value.0.clone()));
        }
        if let Some(value) = &body.box_subject_id {
            form.push(("box_subject_id", value.clone()));
        }
        if let Some(value) = &body.box_shared_link {
            form.push(("box_shared_link", value.clone()));
        }
        let payload = crate::internal::form_encode(&form);
        req = runtime::with_form_body(req, payload.as_bytes());
        let resp = self.session.fetch(req).await?;
        let data = runtime::response_bytes(&resp)?;
        Ok(serde_json::from_slice(&data)?)
    }

    pub async fn create_oauth2_token_refresh(
        &self,
        body: crate::models::schemas::PostOAuth2TokenRefreshAccessToken,
    ) -> Result<crate::models::schemas::AccessToken, Error> {
        let mut url = self.session.base_url("api_root");
        url.push_str("/oauth2");
        url.push_str("/token");
        let mut req = self.session.new_request("POST", &url);
        let form: Vec<(&str, String)> = vec![
            ("grant_type", body.grant_type.0.clone()),
            ("client_id", body.client_id.clone()),
            ("client_secret", body.client_secret.clone()),
            ("refresh_token", body.refresh_token.clone()),
        ];
        let payload = crate::internal::form_encode(&form);
        req = runtime::with_form_body(req, payload.as_bytes());
        let resp = self.session.fetch(req).await?;
        let data = runtime::response_bytes(&resp)?;
        Ok(serde_json::from_slice(&data)?)
    }

    pub async fn revoke_oauth2(
        &self,
        body: crate::models::schemas::PostOAuth2Revoke,
    ) -> Result<(), Error> {
        let mut url = self.session.base_url("api_root");
        url.push_str("/oauth2");
        url.push_str("/revoke");
        let mut req = self.session.new_request("POST", &url);
        let mut form: Vec<(&str, String)> = Vec::new();
        if let Some(value) = &body.client_id {
            form.push(("client_id", value.clone()));
        }
        if let Some(value) = &body.client_secret {
            form.push(("client_secret", value.clone()));
        }
        if let Some(value) = &body.token {
            form.push(("token", value.clone()));
        }
        let payload = crate::internal::form_encode(&form);
        req = runtime::with_form_body(req, payload.as_bytes());
        let _ = self.session.fetch(req).await?;
        Ok(())
    }
}