func decodeStartElement(c interfaces.Conn, se xml.StartElement) (xml.Name, interface{}, error) { // Put it in an interface and allocate one. var nv interface{} if t, e := c.CustomStorage()[se.Name]; e { nv = reflect.New(t).Interface() } else if t, e := defaultStorage[se.Name]; e { nv = reflect.New(t).Interface() } else { return xml.Name{}, nil, errors.New("unexpected XMPP message " + se.Name.Space + " <" + se.Name.Local + "/>") } // Unmarshal into that storage. if err := c.In().DecodeElement(nv, &se); err != nil { return xml.Name{}, nil, err } return se.Name, nv, nil }