use reqwest::Method;
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use crate::client::{CallOptions, Client};
use crate::common::{string_enum, MessageResponse};
use crate::error::Result;
use crate::pagination::{static_page, Page};
use crate::resources::escape;
const PATH: &str = "/v2/connectors";
string_enum! {
ConnectorProvider {
TWILIO => "twilio",
PLIVO => "plivo",
TELNYX => "telnyx",
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Connector {
pub id: String,
pub provider: Option<ConnectorProvider>,
pub name: Option<String>,
pub webhook_url: Option<String>,
pub default_room_id: Option<String>,
pub default_rule_id: Option<String>,
pub region: Option<String>,
pub created_at: Option<String>,
#[serde(flatten)]
pub extra: Map<String, Value>,
}
#[derive(Debug, Clone, Default)]
pub struct CreateConnectorParams {
pub provider: Option<ConnectorProvider>,
pub name: Option<String>,
pub room_id: Option<String>,
pub default_rule_id: Option<String>,
pub region: Option<String>,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
struct ConnectorWire {
#[serde(skip_serializing_if = "Option::is_none")]
provider: Option<ConnectorProvider>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
default_room_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
default_rule_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
region: Option<String>,
}
impl From<CreateConnectorParams> for ConnectorWire {
fn from(params: CreateConnectorParams) -> Self {
Self {
provider: params.provider,
name: params.name,
default_room_id: params.room_id,
default_rule_id: params.default_rule_id,
region: params.region,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ConnectorsResource<'a> {
client: &'a Client,
}
impl<'a> ConnectorsResource<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn create(&self, params: CreateConnectorParams) -> Result<Connector> {
let body = ConnectorWire::from(params);
self.client
.data(Method::POST, PATH, CallOptions::json(&body)?)
.await
}
pub async fn list(&self) -> Result<Page<Connector>> {
let connectors: Vec<Connector> = self
.client
.data(Method::GET, PATH, CallOptions::new())
.await?;
Ok(static_page(connectors))
}
pub async fn get(&self, connector_id: &str) -> Result<Connector> {
let path = format!("{PATH}/{}", escape(connector_id));
self.client
.data(Method::GET, &path, CallOptions::new())
.await
}
pub async fn rotate_key(&self, connector_id: &str) -> Result<Connector> {
let path = format!("{PATH}/{}/rotate-key", escape(connector_id));
self.client
.data(Method::POST, &path, CallOptions::new())
.await
}
pub async fn delete(&self, connector_id: &str) -> Result<MessageResponse> {
let path = format!("{PATH}/{}", escape(connector_id));
self.client
.json(Method::DELETE, &path, CallOptions::new())
.await
}
}