use std::string::FromUtf8Error;
use crate::types::{CloseCode, GatewayReceivePayload};
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) enum GatewayCommunication {
Message(RawGatewayMessage),
Error(CloseCode),
}
impl From<RawGatewayMessage> for GatewayCommunication {
fn from(value: RawGatewayMessage) -> Self {
Self::Message(value)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) enum RawGatewayMessage {
Text(String),
Bytes(Vec<u8>),
}
impl RawGatewayMessage {
pub fn into_text(self) -> Result<String, FromUtf8Error> {
match self {
RawGatewayMessage::Text(text) => Ok(text),
RawGatewayMessage::Bytes(bytes) => String::from_utf8(bytes),
}
}
pub fn into_bytes(self) -> Vec<u8> {
match self {
RawGatewayMessage::Text(text) => text.as_bytes().to_vec(),
RawGatewayMessage::Bytes(bytes) => bytes,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GatewayMessage(pub String);
impl GatewayMessage {
pub fn payload(&self) -> Result<GatewayReceivePayload, serde_json::Error> {
serde_json::from_str(&self.0)
}
pub(crate) fn from_raw_json_message(
message: RawGatewayMessage,
) -> Result<GatewayMessage, FromUtf8Error> {
let text = message.into_text()?;
Ok(GatewayMessage(text))
}
pub(crate) fn from_zlib_stream_json_bytes(
bytes: &[u8],
inflate: &mut flate2::Decompress,
) -> Result<GatewayMessage, std::io::Error> {
let mut output = Vec::with_capacity(bytes.len() * 200);
let _status = inflate.decompress_vec(bytes, &mut output, flate2::FlushDecompress::Sync)?;
output.shrink_to_fit();
let string = String::from_utf8(output).unwrap();
Ok(GatewayMessage(string))
}
pub(crate) fn from_zlib_stream_json_message(
message: RawGatewayMessage,
inflate: &mut flate2::Decompress,
) -> Result<GatewayMessage, std::io::Error> {
Self::from_zlib_stream_json_bytes(&message.into_bytes(), inflate)
}
}