use helix_core::EffectSink;
use crate::error::ImError;
use crate::state::ChannelId;
use super::super::{ImWsContext, WsFrame, WsHandlerRegistration, WsMessageHandler};
const CHANNEL_CREATED_ACTION: &str = "channel_created";
struct ChannelCreatedHandler;
impl WsMessageHandler for ChannelCreatedHandler {
fn action(&self) -> &'static str {
CHANNEL_CREATED_ACTION
}
fn handle(
&self,
ctx: &mut ImWsContext<'_>,
frame: &WsFrame,
out: &mut EffectSink,
) -> Result<(), ImError> {
let Ok(data) = frame.data_required() else {
return Ok(());
};
let Some(channel_id) = data
.get("id")
.and_then(serde_json::Value::as_str)
.and_then(ChannelId::from_str)
else {
return Ok(());
};
let causation_id = frame
.cses_track_id()
.or_else(|| {
data.get("reqId")
.or_else(|| data.get("req_id"))
.and_then(serde_json::Value::as_str)
})
.filter(|value| !value.is_empty())
.map(str::to_string);
super::channel_member_update::queue_channel_create_persist(
ctx,
channel_id,
data.clone(),
causation_id,
out,
);
Ok(())
}
}
static CHANNEL_CREATED_HANDLER: ChannelCreatedHandler = ChannelCreatedHandler;
#[cfg(target_arch = "wasm32")]
pub(super) fn inventory_link_anchor() {
std::hint::black_box(&CHANNEL_CREATED_HANDLER);
}
inventory::submit! {
WsHandlerRegistration {
action: CHANNEL_CREATED_ACTION,
handler: &CHANNEL_CREATED_HANDLER,
}
}