// Scan XML token stream for next element and save into val. // If val == nil, allocate new element based on proto map. // Either way, return val. func next(c interfaces.Conn) (xml.Name, interface{}, error) { elem, err := nextElement(c.In()) if err != nil { return xml.Name{}, nil, err } c.Lock().Lock() defer c.Lock().Unlock() switch el := elem.(type) { case xml.StartElement: return decodeStartElement(c, el) case xml.EndElement: return decodeEndElement(el) } return xml.Name{}, nil, fmt.Errorf("unexpected element %s", elem) }