feed dump

This commit is contained in:
Nazar Kanaev 2021-03-22 21:04:10 +00:00
parent cbc75047b8
commit e78c028d20
7 changed files with 161 additions and 82 deletions

53
src/feed/feed.go Normal file
View file

@ -0,0 +1,53 @@
package feed
import (
"encoding/xml"
"errors"
"fmt"
"io"
"strings"
)
var UnknownFormat = errors.New("unknown feed format")
type processor func(r io.Reader) (*Feed, error)
func detect(lookup string) (string, processor) {
lookup = strings.TrimSpace(lookup)
if lookup[0] == '{' {
return "json", ParseJSON
}
decoder := xml.NewDecoder(strings.NewReader(lookup))
for {
token, _ := decoder.Token()
if token == nil {
break
}
if el, ok := token.(xml.StartElement); ok {
switch el.Name.Local {
case "rss":
return "rss", ParseRSS
case "RDF":
return "rss", ParseRDF
case "feed":
return "atom", ParseAtom
}
}
}
return "", nil
}
func Parse(r io.Reader) (*Feed, error) {
var x [1024]byte
numread, err := r.Read(x[:])
fmt.Println(numread, err)
if err != nil {
return nil, fmt.Errorf("Failed to read: %s", err)
}
_, callback := detect(string(x[:]))
if callback == nil {
return nil, UnknownFormat
}
return callback(r)
}