Added Delete methods for slice elements to common attributes, entry, feed, person and source
This commit is contained in:
142
feed.go
142
feed.go
@@ -44,7 +44,19 @@ func (f *Feed) AddAuthor(p *Person) {
|
||||
f.Authors = append(f.Authors, p)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteAuthor deletes the Person from the Feed. It return an error.
|
||||
func (f *Feed) DeleteAuthor(id int) error {
|
||||
length := len(f.Authors)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting author from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Authors = append(f.Authors[:id], f.Authors[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddCategory adds the Category to the Feed.
|
||||
@@ -56,7 +68,19 @@ func (f *Feed) AddCategory(c *Category) {
|
||||
f.Categories = append(f.Categories, c)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteCategory deletes the Category from the Feed. It return an error.
|
||||
func (f *Feed) DeleteCategory(id int) error {
|
||||
length := len(f.Categories)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting category from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Categories = append(f.Categories[:id], f.Categories[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddContributor adds the Person as a contributor to the Feed.
|
||||
@@ -68,7 +92,19 @@ func (f *Feed) AddContributor(c *Person) {
|
||||
f.Contributors = append(f.Contributors, c)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteContributor deletes the Person from the Feed. It return an error.
|
||||
func (f *Feed) DeleteContributor(id int) error {
|
||||
length := len(f.Contributors)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting contributor from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Contributors = append(f.Contributors[:id], f.Contributors[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddLink adds the Link to the Feed. There should be one Link with Rel "self".
|
||||
@@ -80,7 +116,19 @@ func (f *Feed) AddLink(l *Link) {
|
||||
f.Links = append(f.Links, l)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteLink deletes the Link from the Feed. It return an error.
|
||||
func (f *Feed) DeleteLink(id int) error {
|
||||
length := len(f.Links)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting link from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Links = append(f.Links[:id], f.Links[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddExtension adds the Extension to the Feed.
|
||||
@@ -92,7 +140,19 @@ func (f *Feed) AddExtension(e *ExtensionElement) {
|
||||
f.Extensions = append(f.Extensions, e)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteExtension deletes the Extension from the Feed. It return an error.
|
||||
func (f *Feed) DeleteExtension(id int) error {
|
||||
length := len(f.Extensions)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting extension from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Extensions = append(f.Extensions[:id], f.Extensions[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddEntry adds the Entry to the Feed.
|
||||
@@ -104,7 +164,41 @@ func (f *Feed) AddEntry(e *Entry) {
|
||||
f.Entries = append(f.Entries, e)
|
||||
}
|
||||
|
||||
f.Updated.DateTime = DateTime(time.Now())
|
||||
f.Updated = NewDate(time.Now())
|
||||
}
|
||||
|
||||
// DeleteEntry deletes the Entry from the Feed. It return an error.
|
||||
func (f *Feed) DeleteEntry(id int) error {
|
||||
length := len(f.Entries)
|
||||
if id > length {
|
||||
return fmt.Errorf("error deleting entry from feed %v: id %v out of range %v", f.ID.URI, id, length)
|
||||
}
|
||||
|
||||
f.Entries = append(f.Entries[:id], f.Entries[id+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteEntryByURI deletes the Entry from the Feed. It return an error.
|
||||
func (f *Feed) DeleteEntryByURI(uri string) error {
|
||||
if !isValidIRI(uri) {
|
||||
return fmt.Errorf("error deleting entry from feed %v: uri %v invalid", f.ID.URI, uri)
|
||||
}
|
||||
|
||||
index := -1
|
||||
for i, e := range f.Entries {
|
||||
if e.ID.URI == uri {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
if index < 0 {
|
||||
return fmt.Errorf("error deleting entry from feed %v: id %v not found", f.ID.URI, uri)
|
||||
}
|
||||
|
||||
f.Entries = append(f.Entries[:index], f.Entries[index+1:]...)
|
||||
f.Updated = NewDate(time.Now())
|
||||
return nil
|
||||
}
|
||||
|
||||
// Check checks the Feed for incompatibilities with RFC4287. It returns an
|
||||
@@ -124,93 +218,93 @@ func (f *Feed) Check() error {
|
||||
if f.Authors == nil {
|
||||
for _, e := range f.Entries {
|
||||
if err := e.checkAuthors(false); err != nil {
|
||||
return fmt.Errorf("no authors set in feed %v: %v", f, err)
|
||||
return fmt.Errorf("no authors set in feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for i, a := range f.Authors {
|
||||
if err := a.Check(); err != nil {
|
||||
return fmt.Errorf("author element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("author element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i, c := range f.Categories {
|
||||
if err := c.Check(); err != nil {
|
||||
return fmt.Errorf("category element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("category element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
for i, c := range f.Contributors {
|
||||
if err := c.Check(); err != nil {
|
||||
return fmt.Errorf("contributor element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("contributor element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Generator != nil {
|
||||
if err := f.Generator.Check(); err != nil {
|
||||
return fmt.Errorf("generator element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("generator element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Icon != nil {
|
||||
if err := f.Icon.Check(); err != nil {
|
||||
return fmt.Errorf("icon element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("icon element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
for i, l := range f.Links {
|
||||
if err := l.Check(); err != nil {
|
||||
return fmt.Errorf("link element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("link element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
if hasAlternateDuplicateLinks(f.Links) {
|
||||
return fmt.Errorf("links with a rel attribute value of \"alternate\" and duplicate type and hreflang attribute values found in feed %v", f)
|
||||
return fmt.Errorf("links with a rel attribute value of \"alternate\" and duplicate type and hreflang attribute values found in feed %v", f.ID.URI)
|
||||
}
|
||||
|
||||
if f.Logo != nil {
|
||||
if err := f.Logo.Check(); err != nil {
|
||||
return fmt.Errorf("logo element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("logo element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Rights != nil {
|
||||
if err := f.Rights.Check(); err != nil {
|
||||
return fmt.Errorf("rights element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("rights element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Subtitle != nil {
|
||||
if err := f.Subtitle.Check(); err != nil {
|
||||
return fmt.Errorf("subtitle element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("subtitle element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Title == nil {
|
||||
return fmt.Errorf("no title element of feed %v", f)
|
||||
return fmt.Errorf("no title element of feed %v", f.ID.URI)
|
||||
} else {
|
||||
if err := f.Title.Check(); err != nil {
|
||||
return fmt.Errorf("title element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("title element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
if f.Updated == nil {
|
||||
return fmt.Errorf("no updated element of feed %v", f)
|
||||
return fmt.Errorf("no updated element of feed %v", f.ID.URI)
|
||||
} else {
|
||||
if err := f.Updated.Check(); err != nil {
|
||||
return fmt.Errorf("updated element of feed %v: %v", f, err)
|
||||
return fmt.Errorf("updated element of feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
for i, x := range f.Extensions {
|
||||
if err := x.Check(); err != nil {
|
||||
return fmt.Errorf("extension element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("extension element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
for i, n := range f.Entries {
|
||||
if err := n.Check(); err != nil {
|
||||
return fmt.Errorf("entry element %v of feed %v: %v", i, f, err)
|
||||
return fmt.Errorf("entry element %v of feed %v: %v", i, f.ID.URI, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,7 +315,7 @@ func (f *Feed) Check() error {
|
||||
func (f *Feed) ToXML(encoding string) (string, error) {
|
||||
xml, err := xml.MarshalIndent(f, "", " ")
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("error xml encoding feed: %v", err)
|
||||
return "", fmt.Errorf("error xml encoding feed %v: %v", f.ID.URI, err)
|
||||
}
|
||||
|
||||
return fmt.Sprintln(`<?xml version="1.0" encoding="`+encoding+`"?>`) + string(xml), nil
|
||||
|
Reference in New Issue
Block a user