package xmpp import ( "encoding/xml" "log" ) func route(s *xml.StartElement, d *xml.Decoder, c chan<- any) { switch (*s).Name { case xml.Name{`http://etherx.jabber.org/streams`, `features`}: parse(streamFeatures{}, s, d, c) case xml.Name{`urn:ietf:params:xml:ns:xmpp-sasl`, `success`}: parse(saslSuccess{}, s, d, c) case xml.Name{`jabber:client`, `iq`}: parse(iqRx{}, s, d, c) case xml.Name{`jabber:client`, `message`}: parse(message{}, s, d, c) default: d.Skip() } } func parse[T any](data T, s *xml.StartElement, d *xml.Decoder, c chan<- any) { err := d.DecodeElement(&data, s) if err != nil { log.Printf("Could not decode stream features: %v\n", err) } else { c <- data } } func handle(s *session, element any) { switch t := element.(type) { case streamFeatures: handleStreamFeatures(s, t) case saslSuccess: handleSaslSuccess(s) case iqRx: t.handle(s) case message: handleMessage(s, t) default: log.Printf("Unknown parsed element: %v", t) } }