forked from lavina/lavina
42 lines
1.3 KiB
Rust
42 lines
1.3 KiB
Rust
use crate::xml::ToXml;
|
|
use quick_xml::events::{BytesEnd, BytesStart, Event};
|
|
|
|
/// Stream error condition
|
|
///
|
|
/// [Spec](https://xmpp.org/rfcs/rfc6120.html#streams-error-conditions).
|
|
pub enum StreamErrorKind {
|
|
/// The server has experienced a misconfiguration or other internal error that prevents it from servicing the stream.
|
|
InternalServerError,
|
|
/// The server is being shut down and all active streams are being closed.
|
|
SystemShutdown,
|
|
}
|
|
impl StreamErrorKind {
|
|
pub fn from_str(s: &str) -> Option<Self> {
|
|
match s {
|
|
"internal-server-error" => Some(Self::InternalServerError),
|
|
"system-shutdown" => Some(Self::SystemShutdown),
|
|
_ => None,
|
|
}
|
|
}
|
|
pub fn as_str(&self) -> &'static str {
|
|
match self {
|
|
Self::InternalServerError => "internal-server-error",
|
|
Self::SystemShutdown => "system-shutdown",
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct StreamError {
|
|
pub kind: StreamErrorKind,
|
|
}
|
|
impl ToXml for StreamError {
|
|
fn serialize(&self, events: &mut Vec<Event<'static>>) {
|
|
events.push(Event::Start(BytesStart::new("stream:error")));
|
|
events.push(Event::Empty(BytesStart::new(format!(
|
|
r#"{} xmlns="urn:ietf:params:xml:ns:xmpp-streams""#,
|
|
self.kind.as_str()
|
|
))));
|
|
events.push(Event::End(BytesEnd::new("stream:error")));
|
|
}
|
|
}
|