Skip to content

Commit 4298e43

Browse files
authored
Add sort.Interface implementation for Feed (#141)
Order Feed.Items by oldest to newest publish time.
1 parent 2251b44 commit 4298e43

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

feed.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
// Feed is the universal Feed type that atom.Feed
1111
// and rss.Feed gets translated to. It represents
1212
// a web feed.
13+
// Sorting with sort.Sort will order the Items by
14+
// oldest to newest publish time.
1315
type Feed struct {
1416
Title string `json:"title,omitempty"`
1517
Description string `json:"description,omitempty"`
@@ -82,3 +84,21 @@ type Enclosure struct {
8284
Length string `json:"length,omitempty"`
8385
Type string `json:"type,omitempty"`
8486
}
87+
88+
// Len returns the length of Items.
89+
func (f Feed) Len() int {
90+
return len(f.Items)
91+
}
92+
93+
// Less compares PublishedParsed of Items[i], Items[k]
94+
// and returns true if Items[i] is less than Items[k].
95+
func (f Feed) Less(i, k int) bool {
96+
return f.Items[i].PublishedParsed.Before(
97+
*f.Items[k].PublishedParsed,
98+
)
99+
}
100+
101+
// Swap swaps Items[i] and Items[k].
102+
func (f Feed) Swap(i, k int) {
103+
f.Items[i], f.Items[k] = f.Items[k], f.Items[i]
104+
}

feed_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package gofeed_test
2+
3+
import (
4+
"sort"
5+
"testing"
6+
"time"
7+
8+
"github.com/mmcdole/gofeed"
9+
)
10+
11+
func TestFeedSort(t *testing.T) {
12+
oldestItem := &gofeed.Item{
13+
PublishedParsed: &[]time.Time{time.Unix(0, 0)}[0],
14+
}
15+
inbetweenItem := &gofeed.Item{
16+
PublishedParsed: &[]time.Time{time.Unix(1, 0)}[0],
17+
}
18+
newestItem := &gofeed.Item{
19+
PublishedParsed: &[]time.Time{time.Unix(2, 0)}[0],
20+
}
21+
22+
feed := gofeed.Feed{
23+
Items: []*gofeed.Item{
24+
newestItem,
25+
oldestItem,
26+
inbetweenItem,
27+
},
28+
}
29+
expected := gofeed.Feed{
30+
Items: []*gofeed.Item{
31+
oldestItem,
32+
inbetweenItem,
33+
newestItem,
34+
},
35+
}
36+
37+
sort.Sort(feed)
38+
39+
for i, item := range feed.Items {
40+
if !item.PublishedParsed.Equal(
41+
*expected.Items[i].PublishedParsed,
42+
) {
43+
t.Errorf(
44+
"Item PublishedParsed = %s; want %s",
45+
item.PublishedParsed,
46+
expected.Items[i].PublishedParsed,
47+
)
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)