videosdk/resources/
connectors.rs1use reqwest::Method;
5use serde::{Deserialize, Serialize};
6use serde_json::{Map, Value};
7
8use crate::client::{CallOptions, Client};
9use crate::common::{string_enum, MessageResponse};
10use crate::error::Result;
11use crate::pagination::{static_page, Page};
12use crate::resources::escape;
13
14const PATH: &str = "/v2/connectors";
15
16string_enum! {
17 ConnectorProvider {
19 TWILIO => "twilio",
21 PLIVO => "plivo",
23 TELNYX => "telnyx",
25 }
26}
27
28#[derive(Debug, Clone, Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct Connector {
32 pub id: String,
34 pub provider: Option<ConnectorProvider>,
36 pub name: Option<String>,
38 pub webhook_url: Option<String>,
40 pub default_room_id: Option<String>,
42 pub default_rule_id: Option<String>,
44 pub region: Option<String>,
46 pub created_at: Option<String>,
48 #[serde(flatten)]
50 pub extra: Map<String, Value>,
51}
52
53#[derive(Debug, Clone, Default)]
55pub struct CreateConnectorParams {
56 pub provider: Option<ConnectorProvider>,
58 pub name: Option<String>,
60 pub room_id: Option<String>,
62 pub default_rule_id: Option<String>,
64 pub region: Option<String>,
66}
67
68#[derive(Debug, Serialize)]
70#[serde(rename_all = "camelCase")]
71struct ConnectorWire {
72 #[serde(skip_serializing_if = "Option::is_none")]
73 provider: Option<ConnectorProvider>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 name: Option<String>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 default_room_id: Option<String>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 default_rule_id: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 region: Option<String>,
82}
83
84impl From<CreateConnectorParams> for ConnectorWire {
85 fn from(params: CreateConnectorParams) -> Self {
86 Self {
87 provider: params.provider,
88 name: params.name,
89 default_room_id: params.room_id,
90 default_rule_id: params.default_rule_id,
91 region: params.region,
92 }
93 }
94}
95
96#[derive(Debug, Clone, Copy)]
98pub struct ConnectorsResource<'a> {
99 client: &'a Client,
100}
101
102impl<'a> ConnectorsResource<'a> {
103 pub(crate) fn new(client: &'a Client) -> Self {
104 Self { client }
105 }
106
107 pub async fn create(&self, params: CreateConnectorParams) -> Result<Connector> {
109 let body = ConnectorWire::from(params);
110 self.client
111 .data(Method::POST, PATH, CallOptions::json(&body)?)
112 .await
113 }
114
115 pub async fn list(&self) -> Result<Page<Connector>> {
120 let connectors: Vec<Connector> = self
121 .client
122 .data(Method::GET, PATH, CallOptions::new())
123 .await?;
124 Ok(static_page(connectors))
125 }
126
127 pub async fn get(&self, connector_id: &str) -> Result<Connector> {
129 let path = format!("{PATH}/{}", escape(connector_id));
130 self.client
131 .data(Method::GET, &path, CallOptions::new())
132 .await
133 }
134
135 pub async fn rotate_key(&self, connector_id: &str) -> Result<Connector> {
137 let path = format!("{PATH}/{}/rotate-key", escape(connector_id));
138 self.client
139 .data(Method::POST, &path, CallOptions::new())
140 .await
141 }
142
143 pub async fn delete(&self, connector_id: &str) -> Result<MessageResponse> {
145 let path = format!("{PATH}/{}", escape(connector_id));
146 self.client
147 .json(Method::DELETE, &path, CallOptions::new())
148 .await
149 }
150}