sentc-crypto-utils 0.15.0

Common types and functions for sentc sdk and sdk light
Documentation
use alloc::string::{String, ToString};
use alloc::vec::Vec;

use reqwest::header::AUTHORIZATION;
use reqwest::Response;
use sentc_crypto_common::server_default::ServerSuccessOutput;

use crate::error::SdkUtilError;
use crate::handle_server_response;
use crate::http::{auth_header, HttpMethod};

pub(super) async fn make_req(
	method: HttpMethod,
	url: &str,
	auth_token: &str,
	body: Option<String>,
	jwt: Option<&str>,
	group_as_member: Option<&str>,
) -> Result<String, SdkUtilError>
{
	let res = make_req_raw(method, url, auth_token, body, jwt, group_as_member).await?;

	res.text().await.map_err(|_e| SdkUtilError::ResponseErrText)
}

pub(super) async fn make_req_buffer(
	method: HttpMethod,
	url: &str,
	auth_token: &str,
	body: Option<String>,
	jwt: Option<&str>,
	group_as_member: Option<&str>,
) -> Result<Vec<u8>, SdkUtilError>
{
	let res = make_req_raw(method, url, auth_token, body, jwt, group_as_member).await?;

	if res.status().as_u16() >= 400 {
		let text = res
			.text()
			.await
			.map_err(|_e| SdkUtilError::ResponseErrText)?;
		handle_server_response::<ServerSuccessOutput>(text.as_str())?;
		return Ok(Vec::new());
	}

	let buffer = res
		.bytes()
		.await
		.map_err(|_e| SdkUtilError::ResponseErrBytes)?
		.to_vec();

	Ok(buffer)
}

pub(super) async fn make_req_buffer_body(
	method: HttpMethod,
	url: &str,
	auth_token: &str,
	body: Vec<u8>,
	jwt: Option<&str>,
	group_as_member: Option<&str>,
) -> Result<String, SdkUtilError>
{
	let client = reqwest::Client::new();

	let builder = match method {
		HttpMethod::GET => client.get(url),
		HttpMethod::POST => client.post(url),
		HttpMethod::PUT => client.put(url),
		HttpMethod::PATCH => client.patch(url),
		HttpMethod::DELETE => client.delete(url),
	};

	let builder = builder.header("x-sentc-app-token", auth_token);

	let builder = match jwt {
		Some(j) => builder.header(AUTHORIZATION, auth_header(j)),
		None => builder,
	};

	let builder = match group_as_member {
		Some(id) => builder.header("x-sentc-group-access-id", id),
		None => builder,
	};

	let builder = builder.body(body);

	let res = builder
		.send()
		.await
		.map_err(|e| SdkUtilError::RequestErr(e.to_string()))?;

	res.text().await.map_err(|_e| SdkUtilError::ResponseErrText)
}

async fn make_req_raw(
	method: HttpMethod,
	url: &str,
	auth_token: &str,
	body: Option<String>,
	jwt: Option<&str>,
	group_as_member: Option<&str>,
) -> Result<Response, SdkUtilError>
{
	let client = reqwest::Client::new();

	let builder = match method {
		HttpMethod::GET => client.get(url),
		HttpMethod::POST => client.post(url),
		HttpMethod::PUT => client.put(url),
		HttpMethod::PATCH => client.patch(url),
		HttpMethod::DELETE => client.delete(url),
	};

	let builder = builder.header("x-sentc-app-token", auth_token);

	let builder = match jwt {
		Some(j) => builder.header(AUTHORIZATION, auth_header(j)),
		None => builder,
	};

	let builder = match group_as_member {
		Some(id) => builder.header("x-sentc-group-access-id", id),
		None => builder,
	};

	let builder = match body {
		None => builder,
		Some(b) => builder.body(b),
	};

	let res = builder
		.send()
		.await
		.map_err(|e| SdkUtilError::RequestErr(e.to_string()))?;

	Ok(res)
}