diff options
| author | nytpu <alex@nytpu.com> | 2021-03-18 10:19:07 -0600 |
|---|---|---|
| committer | nytpu <alex@nytpu.com> | 2021-03-18 10:19:07 -0600 |
| commit | 5ba676ed5d2f152eda30fd0fcccafced3ff9bf10 (patch) | |
| tree | 2fe9c3acd5f844e30370bf0124cc197747894d75 /fetch/fetch.go | |
| parent | e1a5c68ec75b1cbae5b4bfb788412512c557e9ad (diff) | |
refactor fetch functions to insert into FullData
Diffstat (limited to 'fetch/fetch.go')
| -rw-r--r-- | fetch/fetch.go | 79 |
1 files changed, 37 insertions, 42 deletions
diff --git a/fetch/fetch.go b/fetch/fetch.go index 37d0b67..231c7dc 100644 --- a/fetch/fetch.go +++ b/fetch/fetch.go @@ -9,68 +9,63 @@ package fetch import ( "fmt" "net/url" + "reflect" "golang.nytpu.com/comitium/core" ) -// NewFeed will fetch and create a new core.Feed given any url -func NewFeed(remoteURL *url.URL, title string) (*core.Feed, error) { - switch remoteURL.Scheme { +// Feed will fetch and insert a new core.Feed into a core.FullData given any url +// (or update if it's preexisting) +func Feed(data *core.FullData, remote *url.URL, title string) error { + switch remote.Scheme { case "gemini": - return newGeminiFeed(remoteURL, title) + return geminiFeed(data, remote, title) case "http", "https": - return newHTTPFeed(remoteURL, title) + return httpFeed(data, remote, title) case "gopher", "gophers": - return newGopherFeed(remoteURL, title) + return gopherFeed(data, remote, title) default: - return nil, fmt.Errorf("Unsupported protocol '%s'", remoteURL.Scheme) + return fmt.Errorf("Unsupported protocol '%s'", remote.Scheme) } } -// NewPage will fetch and create a new core.Page given any url -func NewPage(remoteURL *url.URL, title string) (*core.Page, error) { - switch remoteURL.Scheme { +// Page will fetch and insert a new core.Page into a core.FullData given any url +// (or update if it's preexisting) +func Page(data *core.FullData, remote *url.URL, title string) error { + switch remote.Scheme { case "gemini": - return newGeminiPage(remoteURL, title) + return geminiPage(data, remote, title) case "http", "https": - return newHTTPPage(remoteURL, title) + return httpPage(data, remote, title) case "gopher", "gophers": - return newGopherPage(remoteURL, title) + return gopherPage(data, remote, title) default: - return nil, fmt.Errorf("Unsupported protocol '%s'", remoteURL.Scheme) + return fmt.Errorf("Unsupported protocol '%s'", remote.Scheme) } } -// UpdateFeed will check an existing core.Feed for updates -func UpdateFeed(f *core.Feed) error { - switch f.FeedLink.Scheme { - case "gemini": - // return updateGeminiFeed(f) - // TODO - fallthrough - case "http", "https": - // return updateHTTPFeed(f) - // TODO - fallthrough - case "gopher", "gophers": - return updateGopherFeed(f) - default: - return fmt.Errorf("Unsupported protocol '%s'", f.FeedLink.Scheme) +// InsertFeed will insert or update a core.Feed in a core.FullData +func InsertFeed(data *core.FullData, new *core.Feed, remote *url.URL) { + data.FeedsMu.Lock() + oldFeed, ok := data.Feeds[*remote] + if !ok || !reflect.DeepEqual(new, oldFeed) { + // Feeds are different, or there was never an old one + data.Feeds[*remote] = new + data.FeedsMu.Unlock() + } else { + data.FeedsMu.Unlock() } - return nil } -// UpdatePage will check an existing core.Page for updages -func UpdatePage(p *core.Page) error { - switch p.Link.Scheme { - case "gemini": - return updateGeminiPage(p) - case "http", "https": - return updateHTTPPage(p) - case "gopher", "gophers": - return updateGopherPage(p) - default: - return fmt.Errorf("Unsupported protocol '%s'", p.Link.Scheme) +// InsertFeed will insert or update a core.Page in a core.FullData +func InsertPage(data *core.FullData, new *core.Page, remote *url.URL) { + data.PagesMu.Lock() + _, ok := data.Pages[*remote] + if !ok || data.Pages[*remote].Hash != new.Hash { + // pages are different, or there was never an old one + data.Pages[*remote] = new + data.PagesMu.Unlock() + } else { + data.PagesMu.Unlock() } - return nil } |
