use derive_more::From; use quick_xml::events::Event; use quick_xml::name::{Namespace, ResolveResult}; use crate::protos::xmpp::bind::BindRequest; use crate::protos::xmpp::client::{Iq, Message, Presence}; use crate::protos::xmpp::roster::RosterQuery; use crate::protos::xmpp::session::Session; use crate::util::xml::*; use crate::prelude::*; #[derive(PartialEq, Eq, Debug, From)] pub enum IqClientBody { Bind(BindRequest), Session(Session), Roster(RosterQuery), Unknown(Ignore), } impl FromXml for IqClientBody { type P = impl Parser>; fn parse() -> Self::P { |(namespace, event): (ResolveResult<'static>, &'static Event<'static>)| -> Result { let bytes = match event { Event::Start(bytes) => bytes, Event::Empty(bytes) => bytes, _ => return Err(ffail!("Unexpected XML event: {event:?}")), }; let name = bytes.name(); match_parser!(name, namespace, event; BindRequest, Session, RosterQuery, { delegate_parsing!(Ignore, namespace, event).into() } ) } } } #[derive(PartialEq, Eq, Debug, From)] pub enum ClientPacket { Iq(Iq), Message(Message), Presence(Presence), } impl FromXml for ClientPacket { type P = impl Parser>; fn parse() -> Self::P { |(namespace, event): (ResolveResult<'static>, &'static Event<'static>)| -> Result { let Event::Start(bytes) = event else { return Err(ffail!("Unexpected XML event: {event:?}")); }; let name = bytes.name(); match_parser!(name, namespace, event; Iq::, Presence::, Message, { Err(ffail!( "Unexpected XML event of name {:?} in namespace {:?}", name, namespace )) } ) } } }