diff --git a/app/root.go b/app/root.go deleted file mode 100644 index 7d27e34..0000000 --- a/app/root.go +++ /dev/null @@ -1,101 +0,0 @@ -package app - -import ( - "context" - "fmt" - "log" - "os" - "time" - - "github.com/bored-engineer/sitemap" - "github.com/gorilla/feeds" -) - -func CLI(args []string) int { - var app appEnv - err := app.fromArgs(args) - if err != nil { - return 2 - } - if err = app.run(); err != nil { - fmt.Fprintf(os.Stderr, "Runtime error: %v\n", err) - return 1 - } - - return 0 -} - -type appEnv struct { -} - -func (app *appEnv) fromArgs(args []string) error { - return nil -} - -func (app *appEnv) run() error { - - urls, err := sitemap.Fetch(context.TODO(), "https://sitemaps.org/sitemap.xml") - if err != nil { - log.Fatal(err) - } - - feed := &feeds.Feed{ - Title: "Sitemaps", - Link: &feeds.Link{Href: "https://sitemaps.org/"}, - } - - for _, url := range urls { - log.Println(url.LastModification, url.Location) - updated, err := time.Parse("2006-01-02", url.LastModification.String()) - if err != nil { - log.Fatal(err) - } - item := &feeds.Item{ - Id: url.Location, - Link: &feeds.Link{Href: url.Location}, - Updated: updated, - } - feed.Add(item) - } - - atom, err := feed.ToAtom() - if err != nil { - log.Fatal(err) - } - - f, err := os.Create("atom.xml") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - f.WriteString(atom) - - rss, err := feed.ToRss() - if err != nil { - log.Fatal(err) - } - - f, err = os.Create("rss.xml") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - f.WriteString(rss) - - json, err := feed.ToJSON() - if err != nil { - log.Fatal(err) - } - - f, err = os.Create("feed.json") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - f.WriteString(json) - - return nil -} diff --git a/main.go b/main.go index 42c8d7c..cfb1e6f 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,83 @@ package main import ( - "os" + "context" + "fmt" + "log" + "os" + "time" - "github.com/midzer/sitemap2feed/app" + "github.com/bored-engineer/sitemap" + "github.com/gorilla/feeds" ) + func main() { - os.Exit(app.CLI(os.Args[1:])) + if err := run(); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } +} + +func writeFile(fname string, c func() (string, error)) error { + f, err := os.Create(fname) + if err != nil { + return fmt.Errorf("can't create %s: %w", fname, err) + } + defer f.Close() + + s, err := c() + if err != nil { + return fmt.Errorf("can't convert feed: %w", err) + } + + _, err = f.WriteString(s) + if err != nil { + return fmt.Errorf("can't write to %s: %w", fname, err) + } + + return nil +} + +func run() error { + urls, err := sitemap.Fetch(context.Background(), "https://sitemaps.org/sitemap.xml") + if err != nil { + return fmt.Errorf("can't fetch sitemap: %w", err) + } + + feed := &feeds.Feed{ + Title: "Sitemaps", + Link: &feeds.Link{Href: "https://sitemaps.org/"}, + } + + for _, url := range urls { + log.Println(url.LastModification, url.Location) + updated, err := time.Parse("2006-01-02", url.LastModification.String()) + if err != nil { + return fmt.Errorf("can't parse last modification date: %w", err) + } + + item := &feeds.Item{ + Id: url.Location, + Link: &feeds.Link{Href: url.Location}, + Updated: updated, + } + feed.Add(item) + } + + // write atom.xml + if err := writeFile("atom.xml", feed.ToAtom); err != nil { + return err + } + + // write rss.xml + if err := writeFile("rss.xml", feed.ToRss); err != nil { + return err + } + + // write feed.json + if err := writeFile("feed.json", feed.ToJSON); err != nil { + return err + } + + return nil }