implement atom
This commit is contained in:
		
							
								
								
									
										77
									
								
								parser/parser.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								parser/parser.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
package parser
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/xml"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type FeedType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	Rss  FeedType = "rss"
 | 
			
		||||
	Atom FeedType = "atom"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type FeedEntry struct {
 | 
			
		||||
	Link    string
 | 
			
		||||
	Content string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ParseFeed(feedType FeedType, data []byte) ([]FeedEntry, error) {
 | 
			
		||||
	switch feedType {
 | 
			
		||||
	case Rss:
 | 
			
		||||
		return parseRss(data)
 | 
			
		||||
	case Atom:
 | 
			
		||||
		return parseAtom(data)
 | 
			
		||||
	}
 | 
			
		||||
	return nil, fmt.Errorf("Unknown feed type: %s", feedType)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseAtom(data []byte) ([]FeedEntry, error) {
 | 
			
		||||
	v := struct {
 | 
			
		||||
		Items []struct {
 | 
			
		||||
			Link struct {
 | 
			
		||||
				Href string `xml:"href,attr"`
 | 
			
		||||
			} `xml:"link"`
 | 
			
		||||
			Content string `xml:",innerxml"`
 | 
			
		||||
		} `xml:"entry"`
 | 
			
		||||
	}{}
 | 
			
		||||
 | 
			
		||||
	err := xml.Unmarshal(data, &v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var feedEntries []FeedEntry
 | 
			
		||||
	for _, atomEntry := range v.Items {
 | 
			
		||||
		feedEntries = append(feedEntries, FeedEntry{
 | 
			
		||||
			Link:    atomEntry.Link.Href,
 | 
			
		||||
			Content: atomEntry.Content,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return feedEntries, nil
 | 
			
		||||
}
 | 
			
		||||
func parseRss(data []byte) ([]FeedEntry, error) {
 | 
			
		||||
 | 
			
		||||
	v := struct {
 | 
			
		||||
		Items []struct {
 | 
			
		||||
			Link    string `xml:"link"`
 | 
			
		||||
			Content string `xml:",innerxml"`
 | 
			
		||||
		} `xml:"channel>item"`
 | 
			
		||||
	}{}
 | 
			
		||||
 | 
			
		||||
	err := xml.Unmarshal(data, &v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var feedEntries []FeedEntry
 | 
			
		||||
	for _, rssEntry := range v.Items {
 | 
			
		||||
		feedEntries = append(feedEntries, FeedEntry{
 | 
			
		||||
			Link:    rssEntry.Link,
 | 
			
		||||
			Content: rssEntry.Content,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return feedEntries, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user