use serde::Deserialize;
use serde_json::Value;
use crate::bindings::Discriminator;
use super::EventVariant;
#[derive(Deserialize, Clone, PartialEq, Debug)]
pub struct Response {
pub content: ResponseContent,
pub id: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub request: Option<u32>,
}
#[derive(Deserialize, Clone, PartialEq, Debug)]
#[serde(tag = "type")]
pub enum ResponseContent {
#[serde(rename = "undelivered")]
Undelivered,
#[serde(rename = "event")]
Event { content: EventVariant },
#[serde(rename = "error")]
Error { content: ResponseError },
#[serde(rename = "success")]
Success { content: ResponseSuccess },
}
#[derive(Deserialize, Clone, PartialEq, Debug)]
#[serde(tag = "type")]
pub enum ResponseError {
#[serde(rename = "component not found")]
ComponentNotFound,
#[serde(rename = "spawn failed")]
SpawnFailed,
#[serde(rename = "entry not found")]
EntryNotFound,
}
#[derive(Deserialize, Clone, PartialEq, Debug)]
#[serde(tag = "type")]
pub enum ResponseSuccess {
#[serde(rename = "subscribe added")]
SubscribeAdded,
#[serde(rename = "subscribe removed")]
SubscribeRemoved,
#[serde(rename = "listener set")]
ListenerSet { discrim: Discriminator },
#[serde(rename = "dropped")]
Dropped,
#[serde(rename = "rendered")]
Rendered,
#[serde(rename = "spawned")]
Spawned { discrim: Discriminator },
#[serde(rename = "message delivered")]
MessageDelivered,
#[serde(rename = "space created")]
SpaceCreated { discrim: Discriminator },
#[serde(rename = "focus changed")]
FocusChanged,
#[serde(rename = "value")]
Value { value: Value },
#[serde(rename = "value set")]
ValueSet,
#[serde(rename = "removed value")]
RemovedValue,
#[serde(rename = "watching")]
Watching,
#[serde(rename = "unwatched")]
Unwatched,
#[serde(rename = "suppressed")]
Suppressed { id: u32 },
#[serde(rename = "unsuppressed")]
Unsuppressed,
}
impl ResponseContent {
pub fn is_undelivered(&self) -> bool {
self == &Self::Undelivered
}
pub fn is_delivered(&self) -> bool {
!self.is_undelivered()
}
pub fn as_spawned(&self) -> Option<&Discriminator> {
if let Self::Success {
content: ResponseSuccess::Spawned { discrim },
} = self
{
Some(discrim)
} else {
None
}
}
pub fn into_spawned(self) -> Option<Discriminator> {
if let Self::Success {
content: ResponseSuccess::Spawned { discrim },
} = self
{
Some(discrim)
} else {
None
}
}
pub fn as_value(&self) -> Option<&Value> {
if let Self::Success {
content: ResponseSuccess::Value { value },
} = self
{
Some(value)
} else {
None
}
}
pub fn into_value(self) -> Option<Value> {
if let Self::Success {
content: ResponseSuccess::Value { value },
} = self
{
Some(value)
} else {
None
}
}
pub fn as_suppressed(&self) -> Option<u32> {
if let Self::Success {
content: ResponseSuccess::Suppressed { id },
} = self
{
Some(*id)
} else {
None
}
}
}