Compare commits

..

No commits in common. "16d8b577e3df029a497f77ca56c2eb40cf67cde7" and "8bfd8a648e23be27aa72bf56573735c6d96e2cd4" have entirely different histories.

5 changed files with 9 additions and 102 deletions

View File

@ -10,10 +10,6 @@ type ExtensionElement struct {
XMLName xml.Name XMLName xml.Name
} }
func NewExtensionElement(name string, value any) *ExtensionElement {
return &ExtensionElement{XMLName: xml.Name{Local: name}, Value: value}
}
func (e *ExtensionElement) Check() error { func (e *ExtensionElement) Check() error {
if e.Value == nil { if e.Value == nil {
return errors.New("value element of extension element empty") return errors.New("value element of extension element empty")

89
feed.go
View File

@ -4,7 +4,6 @@ import (
"encoding/xml" "encoding/xml"
"errors" "errors"
"fmt" "fmt"
"time"
) )
type Feed struct { type Feed struct {
@ -18,89 +17,18 @@ type Feed struct {
ID *ID `xml:"id"` ID *ID `xml:"id"`
Links []*Link `xml:"link,omitempty"` // There should be one link with rel "self" Links []*Link `xml:"link,omitempty"` // There should be one link with rel "self"
Logo *Logo `xml:"logo,omitempty"` Logo *Logo `xml:"logo,omitempty"`
Rights Text `xml:"rights,omitempty"` Rights *Text `xml:"rights,omitempty"`
Subtitle Text `xml:"subtitle,omitempty"` Subtitle *Text `xml:"subtitle,omitempty"`
Title Text `xml:"title"` Title *Text `xml:"title"`
Updated *Date `xml:"updated"` Updated *Date `xml:"updated"`
Extensions []*ExtensionElement `xml:",any,omitempty"` Extensions []*ExtensionElement `xml:",any,omitempty"`
Entries []*Entry `xml:"entry,omitempty"` Entries []*Entry `xml:"entry,omitempty"`
} }
// NewFeed creates a new feed func (f *Feed) AddExtension(name string, value any) {
func NewFeed(title string, updated time.Time) (*Feed, error) { f.Extensions = append(f.Extensions, &ExtensionElement{XMLName: xml.Name{Local: name}, Value: value})
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
} }
// 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 { func (f *Feed) Check() error {
if f.ID == nil { if f.ID == nil {
return errors.New("no id element of feed") return errors.New("no id element of feed")
@ -167,13 +95,13 @@ func (f *Feed) Check() error {
} }
if f.Rights != nil { 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) return fmt.Errorf("rights element of feed %v: %v", f.ID.URI, err)
} }
} }
if f.Subtitle != nil { 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) 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 { if f.Title == nil {
return fmt.Errorf("no title element of feed %v", f.ID.URI) return fmt.Errorf("no title element of feed %v", f.ID.URI)
} else { } 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) 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) { func (f *Feed) ToXML(encoding string) (string, error) {
xml, err := xml.MarshalIndent(f, "", " ") xml, err := xml.MarshalIndent(f, "", " ")
if err != nil { if err != nil {

5
go.mod
View File

@ -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
View File

@ -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
View File

@ -1,21 +1,12 @@
package atomfeed package atomfeed
import ( import "errors"
"errors"
"fmt"
"github.com/google/uuid"
)
type ID struct { type ID struct {
*CommonAttributes *CommonAttributes
URI URI `xml:"uri"` URI URI `xml:"uri"`
} }
func NewID() *ID {
return &ID{URI: URI(fmt.Sprint("urn:uuid:", uuid.New()))}
}
func (i *ID) Check() error { func (i *ID) Check() error {
if i.URI == "" { if i.URI == "" {
return errors.New("uri element of id empty") return errors.New("uri element of id empty")