lavina/src/projections/xmpp/proto.rs

124 lines
3.6 KiB
Rust
Raw Normal View History

2023-03-11 17:36:38 +00:00
use derive_more::From;
use quick_xml::events::Event;
use quick_xml::name::{Namespace, ResolveResult};
use crate::protos::xmpp::bind::BindRequest;
2023-03-15 14:27:48 +00:00
use crate::protos::xmpp::client::{Iq, Message, Presence};
2023-03-12 21:50:28 +00:00
use crate::protos::xmpp::roster::RosterQuery;
2023-03-12 13:15:13 +00:00
use crate::protos::xmpp::session::Session;
2023-03-12 21:50:28 +00:00
use crate::util::xml::*;
2023-03-11 17:36:38 +00:00
use crate::prelude::*;
#[derive(PartialEq, Eq, Debug, From)]
pub enum IqClientBody {
Bind(BindRequest),
2023-03-12 13:15:13 +00:00
Session(Session),
2023-03-12 21:50:28 +00:00
Roster(RosterQuery),
2023-03-11 17:36:38 +00:00
}
#[derive(From)]
pub struct IqClientBodyParser(IqClientBodyParserInner);
#[derive(From)]
enum IqClientBodyParserInner {
Initial,
Bind(<BindRequest as FromXml>::P),
2023-03-12 13:15:13 +00:00
SessionV(<Session as FromXml>::P),
2023-03-12 21:50:28 +00:00
RosterV(<RosterQuery as FromXml>::P),
2023-03-11 17:36:38 +00:00
}
impl FromXml for IqClientBody {
type P = IqClientBodyParser;
fn parse() -> Self::P {
IqClientBodyParserInner::Initial.into()
}
}
impl Parser for IqClientBodyParser {
type Output = Result<IqClientBody>;
fn consume<'a>(
self: Self,
namespace: quick_xml::name::ResolveResult,
event: &quick_xml::events::Event<'a>,
) -> crate::util::xml::Continuation<Self, Self::Output> {
use IqClientBodyParserInner::*;
match self.0 {
Initial => {
2023-03-12 13:15:13 +00:00
let bytes = match event {
Event::Start(bytes) => bytes,
Event::Empty(bytes) => bytes,
_ => {
return Continuation::Final(Err(ffail!("Unexpected XML event: {event:?}")))
}
2023-03-11 17:36:38 +00:00
};
2023-03-12 21:50:28 +00:00
let name = bytes.name();
match_parser!(IqClientBodyParser, name, namespace, event;
BindRequest,
Session,
RosterQuery
)
2023-03-11 17:36:38 +00:00
}
2023-03-12 21:50:28 +00:00
Bind(p) => delegate_parsing!(p, IqClientBodyParserInner, namespace, event),
SessionV(p) => delegate_parsing!(p, IqClientBodyParserInner, namespace, event),
RosterV(p) => delegate_parsing!(p, IqClientBodyParserInner, namespace, event),
2023-03-11 17:36:38 +00:00
}
}
}
#[derive(PartialEq, Eq, Debug, From)]
pub enum ClientPacket {
Iq(Iq<IqClientBody>),
Message(Message),
Presence(Presence<Ignore>),
}
#[derive(From)]
pub struct ClientPacketParser(ClientPacketParserInner);
impl FromXml for ClientPacket {
type P = ClientPacketParser;
fn parse() -> Self::P {
ClientPacketParserInner::Initial.into()
}
}
#[derive(From)]
enum ClientPacketParserInner {
Initial,
2023-03-15 14:27:48 +00:00
IqV(<Iq<IqClientBody> as FromXml>::P),
MessageV(<Message as FromXml>::P),
PresenceV(<Presence<Ignore> as FromXml>::P),
}
impl Parser for ClientPacketParser {
type Output = Result<ClientPacket>;
fn consume<'a>(
self: Self,
namespace: ResolveResult,
event: &Event<'a>,
) -> Continuation<Self, Self::Output> {
2023-03-15 14:27:48 +00:00
use ClientPacketParserInner::*;
match self.0 {
Initial => {
let Event::Start(bytes) = event else {
return Continuation::Final(Err(ffail!("Unexpected XML event: {event:?}")));
};
2023-03-12 21:50:28 +00:00
let name = bytes.name();
match_parser!(ClientPacketParser, name, namespace, event;
Iq::<IqClientBody>,
Presence::<Ignore>,
2023-03-12 21:50:28 +00:00
Message
)
}
2023-03-12 21:50:28 +00:00
IqV(p) => delegate_parsing!(p, ClientPacketParserInner, namespace, event),
MessageV(p) => delegate_parsing!(p, ClientPacketParserInner, namespace, event),
2023-03-15 14:27:48 +00:00
PresenceV(p) => delegate_parsing!(p, ClientPacketParserInner, namespace, event),
}
}
}