Compare commits
No commits in common. "16d8b577e3df029a497f77ca56c2eb40cf67cde7" and "8bfd8a648e23be27aa72bf56573735c6d96e2cd4" have entirely different histories.
16d8b577e3
...
8bfd8a648e
@ -10,10 +10,6 @@ type ExtensionElement struct {
|
||||
XMLName xml.Name
|
||||
}
|
||||
|
||||
func NewExtensionElement(name string, value any) *ExtensionElement {
|
||||
return &ExtensionElement{XMLName: xml.Name{Local: name}, Value: value}
|
||||
}
|
||||
|
||||
func (e *ExtensionElement) Check() error {
|
||||
if e.Value == nil {
|
||||
return errors.New("value element of extension element empty")
|
||||
|
89
feed.go
89
feed.go
@ -4,7 +4,6 @@ import (
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Feed struct {
|
||||
@ -18,89 +17,18 @@ type Feed struct {
|
||||
ID *ID `xml:"id"`
|
||||
Links []*Link `xml:"link,omitempty"` // There should be one link with rel "self"
|
||||
Logo *Logo `xml:"logo,omitempty"`
|
||||
Rights Text `xml:"rights,omitempty"`
|
||||
Subtitle Text `xml:"subtitle,omitempty"`
|
||||
Title Text `xml:"title"`
|
||||
Rights *Text `xml:"rights,omitempty"`
|
||||
Subtitle *Text `xml:"subtitle,omitempty"`
|
||||
Title *Text `xml:"title"`
|
||||
Updated *Date `xml:"updated"`
|
||||
Extensions []*ExtensionElement `xml:",any,omitempty"`
|
||||
Entries []*Entry `xml:"entry,omitempty"`
|
||||
}
|
||||
|
||||
// NewFeed creates a new feed
|
||||
func NewFeed(title string, updated time.Time) (*Feed, error) {
|
||||
text, err := NewText("text", title)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error creating new feed: %v", err)
|
||||
}
|
||||
|
||||
return &Feed{
|
||||
ID: NewID(),
|
||||
Title: text,
|
||||
Updated: NewDate(time.Now()),
|
||||
}, nil
|
||||
func (f *Feed) AddExtension(name string, value any) {
|
||||
f.Extensions = append(f.Extensions, &ExtensionElement{XMLName: xml.Name{Local: name}, Value: value})
|
||||
}
|
||||
|
||||
// AddAuthor adds the person as an author to the feed
|
||||
func (f *Feed) AddAuthor(p *Person) {
|
||||
if f.Authors == nil {
|
||||
f.Authors = make([]*Person, 1)
|
||||
f.Authors[0] = p
|
||||
} else {
|
||||
f.Authors = append(f.Authors, p)
|
||||
}
|
||||
}
|
||||
|
||||
// AddCategory adds the category to the feed
|
||||
func (f *Feed) AddCategory(c *Category) {
|
||||
if f.Categories == nil {
|
||||
f.Categories = make([]*Category, 1)
|
||||
f.Categories[0] = c
|
||||
} else {
|
||||
f.Categories = append(f.Categories, c)
|
||||
}
|
||||
}
|
||||
|
||||
// AddContributor adds the contributor to the feed
|
||||
func (f *Feed) AddContributor(c *Person) {
|
||||
if f.Contributors == nil {
|
||||
f.Contributors = make([]*Person, 1)
|
||||
f.Contributors[0] = c
|
||||
} else {
|
||||
f.Contributors = append(f.Contributors, c)
|
||||
}
|
||||
}
|
||||
|
||||
// AddLink adds the link to the feed
|
||||
func (f *Feed) AddLink(l *Link) {
|
||||
if f.Links == nil {
|
||||
f.Links = make([]*Link, 1)
|
||||
f.Links[0] = l
|
||||
} else {
|
||||
f.Links = append(f.Links, l)
|
||||
}
|
||||
}
|
||||
|
||||
// AddExtension adds the extension to the feed
|
||||
func (f *Feed) AddExtension(e *ExtensionElement) {
|
||||
if f.Extensions == nil {
|
||||
f.Extensions = make([]*ExtensionElement, 1)
|
||||
f.Extensions[0] = e
|
||||
} else {
|
||||
f.Extensions = append(f.Extensions, e)
|
||||
}
|
||||
}
|
||||
|
||||
// AddEntry adds the entry to the feed
|
||||
func (f *Feed) AddEntry(e *Entry) {
|
||||
if f.Entries == nil {
|
||||
f.Entries = make([]*Entry, 1)
|
||||
f.Entries[0] = e
|
||||
} else {
|
||||
f.Entries = append(f.Entries, e)
|
||||
}
|
||||
}
|
||||
|
||||
// Check checks the feed for incompatibilities with the Atom standard
|
||||
func (f *Feed) Check() error {
|
||||
if f.ID == nil {
|
||||
return errors.New("no id element of feed")
|
||||
@ -167,13 +95,13 @@ func (f *Feed) Check() error {
|
||||
}
|
||||
|
||||
if f.Rights != nil {
|
||||
if err := f.Rights.Check(); err != nil {
|
||||
if err := (*f.Rights).Check(); err != nil {
|
||||
return fmt.Errorf("rights element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Subtitle != nil {
|
||||
if err := f.Subtitle.Check(); err != nil {
|
||||
if err := (*f.Subtitle).Check(); err != nil {
|
||||
return fmt.Errorf("subtitle element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
@ -181,7 +109,7 @@ func (f *Feed) Check() error {
|
||||
if f.Title == nil {
|
||||
return fmt.Errorf("no title element of feed %v", f.ID.URI)
|
||||
} else {
|
||||
if err := f.Title.Check(); err != nil {
|
||||
if err := (*f.Title).Check(); err != nil {
|
||||
return fmt.Errorf("title element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
@ -232,7 +160,6 @@ func (f *Feed) Standardize() {
|
||||
}
|
||||
}
|
||||
|
||||
// ToXML converts the feed to XML
|
||||
func (f *Feed) ToXML(encoding string) (string, error) {
|
||||
xml, err := xml.MarshalIndent(f, "", " ")
|
||||
if err != nil {
|
||||
|
5
go.mod
5
go.mod
@ -1,5 +0,0 @@
|
||||
module streifling.com/jason/atom-feed
|
||||
|
||||
go 1.23.2
|
||||
|
||||
require github.com/google/uuid v1.6.0
|
2
go.sum
2
go.sum
@ -1,2 +0,0 @@
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
11
id.go
11
id.go
@ -1,21 +1,12 @@
|
||||
package atomfeed
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
import "errors"
|
||||
|
||||
type ID struct {
|
||||
*CommonAttributes
|
||||
URI URI `xml:"uri"`
|
||||
}
|
||||
|
||||
func NewID() *ID {
|
||||
return &ID{URI: URI(fmt.Sprint("urn:uuid:", uuid.New()))}
|
||||
}
|
||||
|
||||
func (i *ID) Check() error {
|
||||
if i.URI == "" {
|
||||
return errors.New("uri element of id empty")
|
||||
|
Loading…
x
Reference in New Issue
Block a user