1use transport::Transport;
2use error::Error;
3use ns;
4
5use xml::writer::XmlEvent as WriterEvent;
6
7pub trait Connection {
8 type InitError;
9 type CloseError;
10
11 fn namespace() -> &'static str;
12
13 fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Self::InitError>;
14 fn close<T: Transport>(transport: &mut T) -> Result<(), Self::CloseError>;
15}
16
17pub struct C2S;
18
19impl Connection for C2S {
20 type InitError = Error;
21 type CloseError = Error;
22
23 fn namespace() -> &'static str { ns::CLIENT }
24
25 fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Error> {
26 transport.write_event(WriterEvent::start_element("stream:stream")
27 .attr("to", domain)
28 .attr("id", id)
29 .default_ns(ns::CLIENT)
30 .ns("stream", ns::STREAM))?;
31 Ok(())
32 }
33
34 fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
35 transport.write_event(WriterEvent::end_element())?;
36 Ok(())
37 }
38}
39
40pub struct Component2S;
41
42impl Connection for Component2S {
43 type InitError = Error;
44 type CloseError = Error;
45
46 fn namespace() -> &'static str { ns::COMPONENT_ACCEPT }
47
48 fn init<T: Transport>(transport: &mut T, domain: &str, id: &str) -> Result<(), Error> {
49 transport.write_event(WriterEvent::start_element("stream:stream")
50 .attr("to", domain)
51 .attr("id", id)
52 .default_ns(ns::COMPONENT_ACCEPT)
53 .ns("stream", ns::STREAM))?;
54 Ok(())
55 }
56
57 fn close<T: Transport>(transport: &mut T) -> Result<(), Error> {
58 transport.write_event(WriterEvent::end_element())?;
59 Ok(())
60 }
61}