From cf131f0bcf4ecbd7b0f8853d92d2cce0dd000a1b Mon Sep 17 00:00:00 2001 From: Jason Streifling Date: Sun, 20 Oct 2024 15:10:58 +0200 Subject: [PATCH] Touched up README --- README.md | 261 ++++++++++++++++++++++++++++++++++++++---------------- atom.go | 2 +- 2 files changed, 186 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 02b067a..56d4711 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ go get git.streifling.com/jason/atom@latest ## Usage +### Basic Feed + This library provides convenient functions to safely create, extend and delete elements and attributes of Atom feeds. It also provides checks for all constructs' adherence to RFC4287. @@ -22,37 +24,37 @@ constructs' adherence to RFC4287. package main import ( - "fmt" - "log" + "fmt" + "log" - "git.streifling.com/jason/atom" + "git.streifling.com/jason/atom" ) func main() { - feed := atom.NewFeed("Example Feed") - if err := feed.Check(); err != nil { - log.Fatalln(err) - } + feed := atom.NewFeed("Example Feed") + if err := feed.Check(); err != nil { + log.Fatalln(err) + } - author := atom.NewPerson("John Doe") - author.Email = "john.doe@example.com" - if err := author.Check(); err != nil { - log.Fatalln(err) - } - feed.AddAuthor(author) + author := atom.NewPerson("John Doe") + author.Email = "john.doe@example.com" + if err := author.Check(); err != nil { + log.Fatalln(err) + } + feed.AddAuthor(author) - entry := atom.NewEntry("First Entry") - entry.Content = atom.NewContent(atom.InlineText, "text", "This is the content of the first entry.") - if err := entry.Check(); err != nil { - log.Fatalln(err) - } - feed.AddEntry(entry) + entry := atom.NewEntry("First Entry") + entry.Content = atom.NewContent(atom.InlineText, "text", "This is the content of the first entry.") + if err := entry.Check(); err != nil { + log.Fatalln(err) + } + feed.AddEntry(entry) - feedString, err := feed.ToXML("utf-8") - if err != nil { - log.Fatalln(err) - } - fmt.Println(feedString) + feedString, err := feed.ToXML("UTF-8") + if err != nil { + log.Fatalln(err) + } + fmt.Println(feedString) } ``` @@ -63,70 +65,177 @@ provide. package main import ( - "fmt" - "log" - "time" + "fmt" + "log" + "time" - "git.streifling.com/jason/atom" + "git.streifling.com/jason/atom" + "github.com/google/uuid" ) func main() { - now := time.Now() + now := time.Now() - feed := &atom.Feed{ - Title: &atom.PlainText{ - Type: "text", - Text: "Example Feed", - }, - ID: &atom.ID{URI: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6"}, - Updated: &atom.Date{DateTime: atom.DateTime(now)}, - Authors: []*atom.Person{ - { - Name: "John Doe", - Email: "john.doe@example.com", - }, - }, - Entries: []*atom.Entry{ - { - Title: &atom.PlainText{ - Type: "text", - Text: "First Entry", - }, - ID: &atom.ID{URI: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"}, - Updated: &atom.Date{DateTime: atom.DateTime(now)}, - Content: &atom.InlineTextContent{ - Type: "text", - Text: "This is the content of the first entry.", - }, - }, - }, - } + feed := &atom.Feed{ + Title: &atom.PlainText{ + Type: "text", + Text: "Example Feed", + }, + ID: &atom.ID{URI: fmt.Sprint("urn:uuid:", uuid.New())}, + Updated: &atom.Date{DateTime: atom.DateTime(now)}, + Authors: []*atom.Person{ + { + Name: "John Doe", + Email: "john.doe@example.com", + }, + }, + Entries: []*atom.Entry{ + { + Title: &atom.PlainText{ + Type: "text", + Text: "First Entry", + }, + ID: &atom.ID{URI: fmt.Sprint("urn:uuid:", uuid.New())}, + Updated: &atom.Date{DateTime: atom.DateTime(now)}, + Content: &atom.InlineTextContent{ + Type: "text", + Text: "This is the content of the first entry.", + }, + }, + }, + } - feedString, err := feed.ToXML("utf-8") - if err != nil { - log.Fatalln(err) - } - fmt.Println(feedString) + feedString, err := feed.ToXML("UTF-8") + if err != nil { + log.Fatalln(err) + } + fmt.Println(feedString) } ``` The output of both ways of using it is an RFC4287 compliant Atom feed. ```xml - + - - John Doe - john.doe@example.com - - urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 - Example Feed - 2024-10-18T05:49:08+02:00 - - This is the content of the first entry. - urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a - First Entry - 2006-01-02T15:04:05+07:00 - + + John Doe + john.doe@example.com + + urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 + Example Feed + 2024-10-18T05:49:08+02:00 + + This is the content of the first entry. + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + First Entry + 2006-01-02T15:04:05+07:00 + + +``` + +### Compliance and Error Checking + +All Atom constructs have their own ```construct.Check()``` method. It checks for +compliance with RFC4287 and errors. This allows one to be certain that only +compliant constructs are added to their respective parent construct. It also +means that not the entire feed has to be checked every time a new construct is +added. Instead one only checks the current construct and all of its +sub-constructs with a single ```construct.Check()``` call. + +```go +package main + +import ( + "fmt" + "log" + + "git.streifling.com/jason/atom" +) + +func main() { + feed := atom.NewFeed("Example Feed") + if err := feed.Check(); err != nil { + log.Fatalln(err) + } + + entry := atom.NewEntry("One") + entry.Content = atom.NewContent(atom.InlineText, "text", "Entry One") + entry.AddAuthor(atom.NewPerson("John Doe")) + if err := entry.Check(); err != nil { + log.Fatalln(err) + } + feed.AddEntry(entry) + + feedString, err := feed.ToXML("UTF-8") + if err != nil { + log.Fatalln(err) + } + fmt.Println(feedString) +} +``` + +### Adding and Deleting Items + +To add elements to any slice one calls the appropriate +```someone.AddSomething(toBeAdded)``` method. It returns the item's index +number. To delete the item one calls the Delete method. + +```go +package main + +import ( + "fmt" + "log" + + "git.streifling.com/jason/atom" +) + +func main() { + feed := atom.NewFeed("Feed") + if err := feed.Check(); err != nil { + log.Fatalln(err) + } + + e1 := atom.NewEntry("One") + e1.Content = atom.NewContent(atom.InlineText, "text", "Entry One") + if err := e1.Check(); err != nil { + log.Fatalln(err) + } + i1 := feed.AddEntry(e1) + + e2 := atom.NewEntry("Two") + e2.Content = atom.NewContent(atom.InlineText, "text", "Entry Two") + if err := e2.Check(); err != nil { + log.Fatalln(err) + } + feed.AddEntry(e2) + + if err := feed.DeleteEntry(i1); err != nil { + log.Fatalln(err) + } + + feedString, err := feed.ToXML("UTF-8") + if err != nil { + log.Fatalln(err) + } + fmt.Println(feedString) +} +``` + +The output of this example looks like this. It only shows the second entry. + +```xml + + + urn:uuid:ae89d343-b535-447d-ac14-4b80d3e02a2f + Example Feed + 2024-10-20T14:57:02+02:00 + + Entry Two + urn:uuid:620c6f73-ee1d-4c1e-be98-b0b1ad7a053f + Two + 2024-10-20T14:57:02+02:00 + ``` diff --git a/atom.go b/atom.go index 92db796..8158efb 100644 --- a/atom.go +++ b/atom.go @@ -21,8 +21,8 @@ func addToSlice[C Countable](slice *[]C, countable C) int { if *slice == nil { *slice = make([]C, 0) } - *slice = append(*slice, countable) + *slice = append(*slice, countable) return len(*slice) - 1 }