use reqwest::Method;
use crate::{
Client, Connection, ConnectionAuditEntry, ConnectionLabelsUpdate, ConnectionListOptions,
ConnectionRequest, ConnectionStatusUpdate, RequestOptions, Result,
};
use super::path_segment;
#[derive(Debug, Clone)]
pub struct Connections {
client: Client,
}
impl Connections {
pub(crate) fn new(client: Client) -> Self {
Self { client }
}
pub async fn create(
&self,
input: &ConnectionRequest,
options: RequestOptions,
) -> Result<Connection> {
let request = self
.client
.request(Method::POST, "/v1/connections")?
.json(input);
self.client.send(request, options).await
}
pub async fn list(&self, options: &ConnectionListOptions) -> Result<Vec<Connection>> {
let request = self
.client
.request(Method::GET, "/v1/connections")?
.query(options);
self.client.send_collection(request, "connections").await
}
pub async fn get(&self, id: &str) -> Result<Connection> {
self.get_path(&format!("/v1/connections/{}", path_segment(id)))
.await
}
pub async fn delete(&self, id: &str, options: RequestOptions) -> Result<()> {
let request = self.client.request(
Method::DELETE,
&format!("/v1/connections/{}", path_segment(id)),
)?;
self.client.send(request, options).await
}
pub async fn validate(&self, id: &str, options: RequestOptions) -> Result<Connection> {
self.client
.post_empty(
&format!("/v1/connections/{}/validate", path_segment(id)),
options,
)
.await
}
pub async fn list_audit(
&self,
id: &str,
options: &ConnectionListOptions,
) -> Result<Vec<ConnectionAuditEntry>> {
let request = self
.client
.request(
Method::GET,
&format!("/v1/connections/{}/audit", path_segment(id)),
)?
.query(options);
self.client.send_collection(request, "audit").await
}
pub async fn update_labels(
&self,
id: &str,
input: &ConnectionLabelsUpdate,
options: RequestOptions,
) -> Result<Connection> {
self.patch(
&format!("/v1/connections/{}/labels", path_segment(id)),
input,
options,
)
.await
}
pub async fn update_status(
&self,
id: &str,
input: &ConnectionStatusUpdate,
options: RequestOptions,
) -> Result<Connection> {
self.patch(
&format!("/v1/connections/{}/status", path_segment(id)),
input,
options,
)
.await
}
pub async fn test(&self, input: &ConnectionRequest, options: RequestOptions) -> Result<bool> {
#[derive(serde::Deserialize)]
struct TestResult {
#[serde(alias = "ok")]
success: bool,
}
let request = self
.client
.request(Method::POST, "/v1/connections/test")?
.json(input);
let result: TestResult = self.client.send(request, options).await?;
Ok(result.success)
}
async fn get_path(&self, path: &str) -> Result<Connection> {
let request = self.client.request(Method::GET, path)?;
self.client.send(request, RequestOptions::default()).await
}
async fn patch<T: serde::Serialize + ?Sized>(
&self,
path: &str,
input: &T,
options: RequestOptions,
) -> Result<Connection> {
let request = self.client.request(Method::PATCH, path)?.json(input);
self.client.send(request, options).await
}
}