1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//! [`Room`] definitions.
use derive_more::{AsRef, Display, From, Into};
use ref_cast::RefCast;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::{member, Pipeline};
/// Media [`Element`] representing a single space where multiple [`Member`]s can
/// interact with each other.
///
/// [`Element`]: crate::Element
/// [`Member`]: crate::Member
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Room {
/// ID of this [`Room`] media [`Element`].
///
/// [`Element`]: crate::Element
pub id: Id,
/// [`Spec`] of this [`Room`] media [`Element`].
///
/// [`Element`]: crate::Element
pub spec: Spec,
}
/// Spec of a [`Room`] media [`Element`].
///
/// [`Element`]: crate::Element
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Spec {
/// Media pipeline representing [`Member`]s of this [`Room`].
///
/// [`Element`]: crate::Element
/// [`Member`]: crate::Member
pub pipeline: Pipeline<member::Id, PipelineSpec>,
}
/// Specs of [`Element`]s allowed a [`Room`]'s [`Spec::pipeline`].
///
/// [`Element`]: crate::Element
#[derive(Clone, Debug, Eq, From, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(feature = "serde", serde(tag = "kind", content = "spec"))]
pub enum PipelineSpec {
/// [`Member`] media [`Element`].
///
/// [`Element`]: crate::Element
/// [`Member`]: crate::Member
Member(member::Spec),
}
/// ID of a [`Room`] media [`Element`].
///
/// [`Element`]: crate::Element
#[derive(
AsRef,
Clone,
Debug,
Display,
Eq,
From,
Hash,
Into,
Ord,
PartialEq,
PartialOrd,
RefCast,
)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
#[from(&str, String)]
#[into(String)]
#[repr(transparent)]
pub struct Id(Box<str>);
#[cfg(feature = "client-api")]
impl From<medea_client_api_proto::RoomId> for Id {
fn from(id: medea_client_api_proto::RoomId) -> Self {
id.0.into()
}
}