use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
conversation::{State, Timers},
Client, PageMeta, TwilioError,
};
pub struct ParticipantConversations<'a> {
pub client: &'a Client,
}
#[allow(dead_code)]
#[derive(Deserialize)]
pub struct ParticipantConversationPage {
conversations: Vec<ParticipantConversation>,
meta: PageMeta,
}
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct ParticipantConversation {
pub account_sid: String,
pub chat_service_sid: String,
pub participant_sid: String,
pub participant_user_sid: Option<String>,
pub participant_identity: Option<String>,
pub participant_messaging_binding: Option<ParticipantMessagingBinding>,
pub conversation_sid: String,
pub conversation_unique_name: Option<String>,
pub conversation_friendly_name: Option<String>,
pub conversation_attributes: String,
pub conversation_date_created: String,
pub conversation_date_updated: String,
pub conversation_created_by: String,
pub conversation_state: State,
pub conversation_timers: Timers,
pub links: Links,
}
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct ParticipantMessagingBinding {
pub address: String,
pub proxy_address: String,
#[serde(rename = "type")]
pub type_field: String,
pub level: Option<String>,
pub name: Option<String>,
pub projected_address: Option<String>,
}
#[derive(Clone, Default, Debug, Deserialize, PartialEq)]
pub struct Links {
pub participant: String,
pub conversation: String,
}
#[derive(Serialize)]
#[serde(rename_all(serialize = "PascalCase"))]
struct ListParams {
identity: Option<String>,
address: Option<String>,
}
impl ParticipantConversations<'_> {
pub async fn list(
&self,
identity: Option<String>,
address: Option<String>,
) -> Result<Vec<ParticipantConversation>, TwilioError> {
let params = ListParams { identity, address };
let mut participant_conversations_page = self
.client
.send_request::<ParticipantConversationPage, ListParams>(
Method::GET,
"https://conversations.twilio.com/v1/ParticipantConversations",
Some(¶ms),
None,
)
.await?;
let mut results: Vec<ParticipantConversation> =
participant_conversations_page.conversations;
while (participant_conversations_page.meta.next_page_url).is_some() {
participant_conversations_page = self
.client
.send_request::<ParticipantConversationPage, ()>(
Method::GET,
&participant_conversations_page.meta.next_page_url.unwrap(),
None,
None,
)
.await?;
results.append(&mut participant_conversations_page.conversations);
}
Ok(results)
}
}