Message 编写进行中

计划进行:完善程序,完善错误处理,完善测试类
This commit is contained in:
Eigeen 2024-01-08 23:14:36 +08:00
parent 5eb60dbbc6
commit 6f89e87d53
Signed by: eigeen
GPG Key ID: B730E75AFABD2ED8
2 changed files with 47 additions and 38 deletions

View File

@ -12,5 +12,5 @@ futures = "0.3.30"
serde = { version = "1.0.195", features = ["derive"] }
serde_bytes = "0.11.14"
serde_json = "1.0.111"
strum_macros = "0.25.3"
thiserror = "1.0.56"
tokio-tungstenite = "0.21.0"

View File

@ -1,7 +1,6 @@
use std::io;
use serde::Serialize;
use strum_macros::{AsRefStr, Display, EnumString};
use thiserror::Error;
use crate::core::packet::{Packet, PacketError};
// #[allow(unused_variables, dead_code)]
@ -9,63 +8,67 @@ use crate::core::packet::{Packet, PacketError};
pub enum MessageError {
#[error("{0}")]
InvalidPacket(#[from] PacketError),
#[error("{0}")]
InvalidJsonBody(#[from] serde_json::Error),
#[error("parse json command failed")]
InvalidCommand,
#[error("no message available")]
NoMessage,
#[error("unknown message error")]
Unknown,
}
/// 命令名对照表,用于对应解析命令名称
// #[allow(unused_variables, dead_code)]
#[derive(Debug, PartialEq, Display, AsRefStr, EnumString)]
pub enum Command {
Undefined,
#[strum(serialize = "DANMU_MSG")]
DanmuMsg,
#[strum(serialize = "SUPER_CHAT_MESSAGE")]
SuperChatMessage,
#[strum(serialize = "SUPER_CHAT_MESSAGE_DELETE")]
SuperChatMessageDelete,
#[strum(serialize = "SEND_GIFT")]
SendGift,
}
impl Default for Command {
fn default() -> Self {
Self::Undefined
}
}
impl Command {
pub fn from_str(cmd: &str) -> Self {
cmd.parse().unwrap_or_default()
}
}
#[allow(unused_variables, dead_code)]
#[derive(Serialize, Debug)]
#[serde(tag = "cmd", content = "data")]
pub enum Message {
DanmuMsg {},
SuperChatMessage,
SuperChatMessageDelete,
#[serde(rename = "DAMMU_MSG")]
DanmuMsg {
sender: String
},
#[serde(rename = "SUPER_CHAT_MESSAGE")]
SuperChatMessage {
message: String
},
#[serde(rename = "SUPER_CHAT_MESSAGE_DELETE")]
SuperChatMessageDelete {
id: u64
},
#[serde(rename = "SEND_GIFT")]
SendGift {
id: u64
},
}
impl Message {
fn deserialize_json() {}
fn parse_packet_skip_err(single_packet: &Packet) -> Message {}
fn parse_packet(single_packet: &mut Packet) -> Result<Message, MessageError> {
let body = &single_packet.get_body().unwrap()[0];
let message: serde_json::Result<Message> = serde_json::from_slice(body);
match message {
Ok(cmd_json) => Ok(cmd_json),
// TODO: 对错误类型进行处理,字段不存在和语法错误
Err(err) => MessageError::InvalidJsonBody(err)
}
}
/// 从 Packet 中提取 Message
///
/// 只有 Json 格式的非业务消息会被提取,即心跳包回复,认证请求回复等不会被解析。
/// 只有 Json 格式的非业务消息会被提取,
/// 即心跳包回复,认证请求回复等不会被解析,返回 MessageError::NoMessage
pub fn from_packet(packet: &mut Packet) -> Result<Vec<Self>, MessageError> {
let mut packets = packet.get_body_packets()?;
if packets.len() == 0 {
return Err(MessageError::NoMessage);
};
let messages = packets.iter().map(|packet| {
Self::parse_packet_skip_err(packet)
let messages: Vec<Message> = packets.iter_mut().map(|packet| {
let parsed = Self::parse_packet(packet);
// ignore error
match parsed {
Ok(msg) => msg,
Err(_) => ()
}
}).collect();
if messages.len() == 0 {
Err(MessageError::NoMessage)
@ -73,4 +76,10 @@ impl Message {
Ok(messages)
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_from_packet() {}
}