package xmpp import ( "encoding/xml" "errors" "log" ) type tokenRouter struct { start xml.StartElement end xml.EndElement buffer []xml.Token level uint16 // XML nesting level enc *encoder } func newTokenRouter(e *encoder) tokenRouter { return tokenRouter{ buffer: make([]xml.Token, 0), level: 0, enc: e, } } func (r *tokenRouter) route(t xml.Token) error { r.buffer = append(r.buffer, t) switch unwrapped := t.(type) { case xml.StartElement: r.level += 1 if r.level == 1 { r.start = unwrapped // call start handler } case xml.EndElement: if r.level == 0 { log.Println("Ignoring XML end element on nesting level zero") return nil } r.level -= 1 switch r.level { case 0: return errors.New("Stream was closed by server") case 1: // call elementRouter r.buffer = r.buffer[:1] } } return nil }