48 lines
979 B
Go
48 lines
979 B
Go
package arn
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
)
|
|
|
|
// Postable is a generic interface for Threads, Posts and Messages.
|
|
type Postable interface {
|
|
Likeable
|
|
|
|
TitleByUser(*User) string
|
|
HTML() string
|
|
Parent() PostParent
|
|
Posts() []*Post
|
|
CountPosts() int
|
|
TypeName() string
|
|
Creator() *User
|
|
|
|
// Use Get prefix for these to avoid a
|
|
// name clash with the internal fields.
|
|
GetID() string
|
|
GetText() string
|
|
GetCreated() string
|
|
GetParentID() string
|
|
}
|
|
|
|
// ToPostables converts a slice of specific types to a slice of generic postables.
|
|
func ToPostables(sliceOfPosts interface{}) []Postable {
|
|
var postables []Postable
|
|
|
|
v := reflect.ValueOf(sliceOfPosts)
|
|
|
|
for i := 0; i < v.Len(); i++ {
|
|
postable := v.Index(i).Interface().(Postable)
|
|
postables = append(postables, postable)
|
|
}
|
|
|
|
return postables
|
|
}
|
|
|
|
// SortPostablesLatestFirst ...
|
|
func SortPostablesLatestFirst(posts []Postable) {
|
|
sort.Slice(posts, func(i, j int) bool {
|
|
return posts[i].GetCreated() > posts[j].GetCreated()
|
|
})
|
|
}
|