use serde_json::{Map, Value};
use crate::error::Result;
use crate::http::HttpClient;
pub struct Connections<'a> {
http: &'a HttpClient,
}
impl<'a> Connections<'a> {
pub(crate) fn new(http: &'a HttpClient) -> Self {
Self { http }
}
pub async fn list(&self, connector: Option<&str>) -> Result<Value> {
let query = connector.map(|c| serde_json::json!({ "connector": c }));
self.http._get("/connections", query.as_ref()).await
}
pub fn create<'b>(&'b self, connector_name: &str) -> CreateConnectionBuilder<'b, 'a> {
CreateConnectionBuilder::new(self, connector_name, None)
}
pub async fn delete(
&self,
connection_id: &str,
cascade: bool,
forget_grains: bool,
) -> Result<Value> {
let path =
format!("/connections/{connection_id}?cascade={cascade}&forget_grains={forget_grains}");
self.http._delete_no_retry(&path).await
}
pub async fn list_for_memory(&self, memory_id: &str) -> Result<Value> {
let path = format!("/memories/{memory_id}/connections");
self.http._get(&path, None).await
}
pub fn create_for_memory<'b>(
&'b self,
memory_id: &str,
connector_name: &str,
) -> CreateConnectionBuilder<'b, 'a> {
CreateConnectionBuilder::new(self, connector_name, Some(memory_id.to_string()))
}
pub async fn delete_for_memory(
&self,
memory_id: &str,
connection_id: &str,
cascade: bool,
) -> Result<Value> {
let path = format!("/memories/{memory_id}/connections/{connection_id}?cascade={cascade}");
self.http._delete_no_retry(&path).await
}
}
pub struct CreateConnectionBuilder<'b, 'a> {
conns: &'b Connections<'a>,
scope_memory_id: Option<String>,
body: Map<String, Value>,
}
impl<'b, 'a> CreateConnectionBuilder<'b, 'a> {
fn new(
conns: &'b Connections<'a>,
connector_name: &str,
scope_memory_id: Option<String>,
) -> Self {
let mut body = Map::new();
body.insert(
"connector_name".into(),
Value::String(connector_name.to_string()),
);
body.insert("auth_type".into(), Value::String("api_key".to_string()));
Self {
conns,
scope_memory_id,
body,
}
}
pub fn connector_display_name(mut self, display_name: &str) -> Self {
self.body.insert(
"connector_display_name".into(),
Value::String(display_name.to_string()),
);
self
}
pub fn axtion_credential_id(mut self, axtion_credential_id: &str) -> Self {
self.body.insert(
"axtion_credential_id".into(),
Value::String(axtion_credential_id.to_string()),
);
self
}
pub fn auth_type(mut self, auth_type: &str) -> Self {
self.body
.insert("auth_type".into(), Value::String(auth_type.to_string()));
self
}
pub fn memory_id(mut self, memory_id: &str) -> Self {
if self.scope_memory_id.is_none() {
self.body
.insert("memory_id".into(), Value::String(memory_id.to_string()));
}
self
}
pub async fn send(self) -> Result<Value> {
let path = match &self.scope_memory_id {
Some(mid) => format!("/memories/{mid}/connections"),
None => "/connections".to_string(),
};
let resp = self
.conns
.http
._post(&path, Some(&Value::Object(self.body)))
.await?;
Ok(match resp {
Value::Object(mut map) => map.remove("connection").unwrap_or(Value::Object(map)),
other => other,
})
}
}