use serde::{Deserialize, Serialize};
use crate::client::parse_dailyco_response;
use crate::room_properties::{RoomProperties, RoomPropertiesBuilder};
use crate::Client;
#[derive(Debug, Copy, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum RoomPrivacy {
Public,
Private,
}
impl Default for RoomPrivacy {
fn default() -> Self {
Self::Public
}
}
#[derive(Debug, Copy, Clone, Serialize, Default)]
pub struct CreateRoom<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
privacy: Option<RoomPrivacy>,
#[serde(skip_serializing_if = "Option::is_none")]
properties: Option<RoomPropertiesBuilder<'a>>,
}
impl<'a> CreateRoom<'a> {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn name(&mut self, name: &'a str) -> &mut Self {
self.name = Some(name);
self
}
pub fn privacy(&mut self, privacy: RoomPrivacy) -> &mut Self {
self.privacy = Some(privacy);
self
}
pub fn properties(&mut self, properties: RoomPropertiesBuilder<'a>) -> &mut Self {
self.properties = Some(properties);
self
}
pub async fn send(&self, client: &Client) -> crate::Result<Room> {
let room_url = client.base_url.join("rooms/").unwrap();
let resp = client.client.post(room_url).json(self).send().await?;
parse_dailyco_response(resp).await
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Room {
pub id: String,
pub name: String,
pub api_created: bool,
pub privacy: RoomPrivacy,
pub url: String,
pub created_at: String,
pub config: RoomProperties,
}
#[derive(Debug, Copy, Clone, Serialize, Default)]
pub struct UpdateRoom<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
privacy: Option<RoomPrivacy>,
#[serde(skip_serializing_if = "Option::is_none")]
properties: Option<RoomPropertiesBuilder<'a>>,
}
impl<'a> UpdateRoom<'a> {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn privacy(&mut self, privacy: RoomPrivacy) -> &mut Self {
self.privacy = Some(privacy);
self
}
pub fn properties(&mut self, properties: RoomPropertiesBuilder<'a>) -> &mut Self {
self.properties = Some(properties);
self
}
pub async fn send(&self, room_name: &str, client: &Client) -> crate::Result<Room> {
let room_url = client.base_url.join(&format!("rooms/{room_name}")).unwrap();
let resp = client.client.post(room_url).json(self).send().await?;
parse_dailyco_response(resp).await
}
}