#![allow(clippy::too_many_arguments)]
use super::errors::RequestError;
use super::errors::problem_for;
use super::models::Application;
use super::models::ApplicationInfo;
use super::models::ApplicationPost;
use super::models::ApplicationSecret;
use super::models::ApplicationSecretPost;
use super::models::Event;
use super::models::EventPost;
use super::models::EventType;
use super::models::EventTypePost;
use super::models::EventWithPayload;
use super::models::EventsPerDayEntry;
use super::models::IngestedEvent;
use super::models::InstanceConfig;
use super::models::Problem;
use super::models::QuotasResponse;
use super::models::ReplayEvent;
use super::models::RequestAttempt;
use super::models::Response;
use super::models::ServiceToken;
use super::models::ServiceTokenPost;
use super::models::Subscription;
use super::models::SubscriptionPost;
pub trait Transport {
type Error: std::error::Error + Send + Sync + 'static;
fn request(
&self,
method: &str,
path: &str,
query: &[(&str, String)],
body: Option<Vec<u8>>,
) -> impl std::future::Future<Output = Result<(u16, Vec<u8>), Self::Error>> + Send;
}
fn query_value(value: &dyn std::fmt::Display) -> String {
value.to_string()
}
fn path_segment(value: &dyn std::fmt::Display) -> String {
let rendered = query_value(value);
let mut escaped = String::with_capacity(rendered.len());
for byte in rendered.bytes() {
let bare = byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'.' | b'_' | b'~');
if bare {
escaped.push(char::from(byte));
} else {
escaped.push_str(&format!("%{byte:02X}"));
}
}
escaped
}
#[derive(Debug, Clone)]
pub struct ApplicationSecretsApi<T> {
transport: T,
}
impl<T: Transport> ApplicationSecretsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn create(
&self,
body: ApplicationSecretPost,
) -> Result<ApplicationSecret, RequestError> {
let path = "/api/v1/application_secrets/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn delete(
&self,
application_secret_token: &str,
application_id: &str,
) -> Result<(), RequestError> {
let mut path = "/api/v1/application_secrets/{application_secret_token}".to_owned();
path = path.replace(
"{application_secret_token}",
&path_segment(&application_secret_token),
);
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("DELETE", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
pub async fn read(&self, application_id: &str) -> Result<Vec<ApplicationSecret>, RequestError> {
let path = "/api/v1/application_secrets/".to_owned();
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn update(
&self,
application_secret_token: &str,
body: ApplicationSecretPost,
) -> Result<ApplicationSecret, RequestError> {
let mut path = "/api/v1/application_secrets/{application_secret_token}".to_owned();
path = path.replace(
"{application_secret_token}",
&path_segment(&application_secret_token),
);
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("PUT", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct ApplicationsApi<T> {
transport: T,
}
impl<T: Transport> ApplicationsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn create(&self, body: ApplicationPost) -> Result<Application, RequestError> {
let path = "/api/v1/applications/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn delete(&self, application_id: &str) -> Result<(), RequestError> {
let mut path = "/api/v1/applications/{application_id}".to_owned();
path = path.replace("{application_id}", &path_segment(&application_id));
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("DELETE", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
pub async fn get(&self, application_id: &str) -> Result<ApplicationInfo, RequestError> {
let mut path = "/api/v1/applications/{application_id}".to_owned();
path = path.replace("{application_id}", &path_segment(&application_id));
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list(&self, organization_id: &str) -> Result<Vec<Application>, RequestError> {
let path = "/api/v1/applications/".to_owned();
let query: Vec<(&str, String)> = vec![("organization_id", query_value(&organization_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn update(
&self,
application_id: &str,
body: ApplicationPost,
) -> Result<Application, RequestError> {
let mut path = "/api/v1/applications/{application_id}".to_owned();
path = path.replace("{application_id}", &path_segment(&application_id));
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("PUT", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct ErrorsApi<T> {
transport: T,
}
impl<T: Transport> ErrorsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn list(&self) -> Result<Vec<Problem>, RequestError> {
let path = "/api/v1/errors/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct EventTypesApi<T> {
transport: T,
}
impl<T: Transport> EventTypesApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn create(&self, body: EventTypePost) -> Result<EventType, RequestError> {
let path = "/api/v1/event_types/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn delete(
&self,
event_type_name: &str,
application_id: &str,
) -> Result<(), RequestError> {
let mut path = "/api/v1/event_types/{event_type_name}".to_owned();
path = path.replace("{event_type_name}", &path_segment(&event_type_name));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("DELETE", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
pub async fn get(
&self,
event_type_name: &str,
application_id: &str,
) -> Result<EventType, RequestError> {
let mut path = "/api/v1/event_types/{event_type_name}".to_owned();
path = path.replace("{event_type_name}", &path_segment(&event_type_name));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list(&self, application_id: &str) -> Result<Vec<EventType>, RequestError> {
let path = "/api/v1/event_types/".to_owned();
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct EventsApi<T> {
transport: T,
}
impl<T: Transport> EventsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn get(
&self,
event_id: &str,
application_id: &str,
) -> Result<EventWithPayload, RequestError> {
let mut path = "/api/v1/events/{event_id}".to_owned();
path = path.replace("{event_id}", &path_segment(&event_id));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn ingest(&self, body: EventPost) -> Result<IngestedEvent, RequestError> {
let path = "/api/v1/event/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list(&self, application_id: &str) -> Result<Vec<Event>, RequestError> {
let path = "/api/v1/events/".to_owned();
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn replay(&self, event_id: &str, body: ReplayEvent) -> Result<(), RequestError> {
let mut path = "/api/v1/events/{event_id}/replay".to_owned();
path = path.replace("{event_id}", &path_segment(&event_id));
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct EventsPerDayApi<T> {
transport: T,
}
impl<T: Transport> EventsPerDayApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn list_for_application(
&self,
application_id: &str,
from: Option<&str>,
to: Option<&str>,
) -> Result<Vec<EventsPerDayEntry>, RequestError> {
let path = "/api/v1/events_per_day/application".to_owned();
let mut query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
if let Some(from) = from {
query.push(("from", query_value(&from)));
}
if let Some(to) = to {
query.push(("to", query_value(&to)));
}
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list_for_organization(
&self,
organization_id: &str,
from: Option<&str>,
to: Option<&str>,
) -> Result<Vec<EventsPerDayEntry>, RequestError> {
let path = "/api/v1/events_per_day/organization".to_owned();
let mut query: Vec<(&str, String)> =
vec![("organization_id", query_value(&organization_id))];
if let Some(from) = from {
query.push(("from", query_value(&from)));
}
if let Some(to) = to {
query.push(("to", query_value(&to)));
}
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct InstanceApi<T> {
transport: T,
}
impl<T: Transport> InstanceApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn get(&self) -> Result<InstanceConfig, RequestError> {
let path = "/api/v1/instance/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct PayloadContentTypesApi<T> {
transport: T,
}
impl<T: Transport> PayloadContentTypesApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn list(&self) -> Result<Vec<String>, RequestError> {
let path = "/api/v1/payload_content_types/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct QuotasApi<T> {
transport: T,
}
impl<T: Transport> QuotasApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn get(&self) -> Result<QuotasResponse, RequestError> {
let path = "/api/v1/quotas/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct RequestAttemptsApi<T> {
transport: T,
}
impl<T: Transport> RequestAttemptsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn get(
&self,
request_attempt_id: &str,
application_id: &str,
) -> Result<RequestAttempt, RequestError> {
let mut path = "/api/v1/request_attempts/{request_attempt_id}".to_owned();
path = path.replace("{request_attempt_id}", &path_segment(&request_attempt_id));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn read(
&self,
application_id: &str,
event_event_type_names: Option<&str>,
event_id: Option<&str>,
max_created_at: Option<&str>,
min_created_at: Option<&str>,
pagination_cursor: Option<&str>,
subscription_id: Option<&str>,
) -> Result<Vec<RequestAttempt>, RequestError> {
let path = "/api/v1/request_attempts/".to_owned();
let mut query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
if let Some(event_event_type_names) = event_event_type_names {
query.push((
"event.event_type_names",
query_value(&event_event_type_names),
));
}
if let Some(event_id) = event_id {
query.push(("event_id", query_value(&event_id)));
}
if let Some(max_created_at) = max_created_at {
query.push(("max_created_at", query_value(&max_created_at)));
}
if let Some(min_created_at) = min_created_at {
query.push(("min_created_at", query_value(&min_created_at)));
}
if let Some(pagination_cursor) = pagination_cursor {
query.push(("pagination_cursor", query_value(&pagination_cursor)));
}
if let Some(subscription_id) = subscription_id {
query.push(("subscription_id", query_value(&subscription_id)));
}
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct ResponseApi<T> {
transport: T,
}
impl<T: Transport> ResponseApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn get(
&self,
response_id: &str,
application_id: &str,
) -> Result<Response, RequestError> {
let mut path = "/api/v1/responses/{response_id}".to_owned();
path = path.replace("{response_id}", &path_segment(&response_id));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct ServiceTokenApi<T> {
transport: T,
}
impl<T: Transport> ServiceTokenApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn create(&self, body: ServiceTokenPost) -> Result<ServiceToken, RequestError> {
let path = "/api/v1/service_token/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn delete(
&self,
service_token_id: &str,
organization_id: &str,
) -> Result<(), RequestError> {
let mut path = "/api/v1/service_token/{service_token_id}".to_owned();
path = path.replace("{service_token_id}", &path_segment(&service_token_id));
let query: Vec<(&str, String)> = vec![("organization_id", query_value(&organization_id))];
let issued = self.transport.request("DELETE", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
pub async fn edit(
&self,
service_token_id: &str,
body: ServiceTokenPost,
) -> Result<ServiceToken, RequestError> {
let mut path = "/api/v1/service_token/{service_token_id}".to_owned();
path = path.replace("{service_token_id}", &path_segment(&service_token_id));
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("PUT", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn get(
&self,
service_token_id: &str,
organization_id: &str,
) -> Result<ServiceToken, RequestError> {
let mut path = "/api/v1/service_token/{service_token_id}".to_owned();
path = path.replace("{service_token_id}", &path_segment(&service_token_id));
let query: Vec<(&str, String)> = vec![("organization_id", query_value(&organization_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list(&self, organization_id: &str) -> Result<Vec<ServiceToken>, RequestError> {
let path = "/api/v1/service_token/".to_owned();
let query: Vec<(&str, String)> = vec![("organization_id", query_value(&organization_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}
#[derive(Debug, Clone)]
pub struct SubscriptionsApi<T> {
transport: T,
}
impl<T: Transport> SubscriptionsApi<T> {
pub fn new(transport: T) -> Self {
Self { transport }
}
pub async fn create(&self, body: SubscriptionPost) -> Result<Subscription, RequestError> {
let path = "/api/v1/subscriptions/".to_owned();
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("POST", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn delete(
&self,
subscription_id: &str,
application_id: &str,
) -> Result<(), RequestError> {
let mut path = "/api/v1/subscriptions/{subscription_id}".to_owned();
path = path.replace("{subscription_id}", &path_segment(&subscription_id));
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("DELETE", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
Ok(())
}
pub async fn get(&self, subscription_id: &str) -> Result<Subscription, RequestError> {
let mut path = "/api/v1/subscriptions/{subscription_id}".to_owned();
path = path.replace("{subscription_id}", &path_segment(&subscription_id));
let query: Vec<(&str, String)> = Vec::new();
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn list(&self, application_id: &str) -> Result<Vec<Subscription>, RequestError> {
let path = "/api/v1/subscriptions/".to_owned();
let query: Vec<(&str, String)> = vec![("application_id", query_value(&application_id))];
let issued = self.transport.request("GET", &path, &query, None);
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
pub async fn update(
&self,
subscription_id: &str,
body: SubscriptionPost,
) -> Result<Subscription, RequestError> {
let mut path = "/api/v1/subscriptions/{subscription_id}".to_owned();
path = path.replace("{subscription_id}", &path_segment(&subscription_id));
let query: Vec<(&str, String)> = Vec::new();
let body = serde_json::to_vec(&body).map_err(RequestError::unwritable)?;
let issued = self.transport.request("PUT", &path, &query, Some(body));
let (status, payload) = issued.await.map_err(RequestError::transport)?;
if let Some(failure) = problem_for(status, &payload) {
return Err(RequestError::Api(Box::new(failure)));
}
let read = serde_json::from_slice(&payload);
read.map_err(|cause| RequestError::unreadable(status, &payload, &cause))
}
}