diff options
| author | Leonardo Bishop <me@leonardobishop.net> | 2025-07-08 23:26:05 +0100 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.net> | 2025-07-08 23:26:05 +0100 |
| commit | cdb75d3fcbc9339b897f8c6ff4d69a577f017393 (patch) | |
| tree | 5e757cd236540c2cea9874c1bc09f19548db05d5 /pkg/index/index.go | |
| parent | b56101f1a11552067f594679a497ebd4cf7427d4 (diff) | |
Rewrite in Go
Diffstat (limited to 'pkg/index/index.go')
| -rw-r--r-- | pkg/index/index.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pkg/index/index.go b/pkg/index/index.go new file mode 100644 index 0000000..35423bd --- /dev/null +++ b/pkg/index/index.go @@ -0,0 +1,63 @@ +package index + +import ( + "maps" + "slices" + "sort" + "sync" + + "github.com/LMBishop/scrapbook/pkg/site" +) + +type SiteIndex struct { + mu sync.RWMutex + sites map[string]*site.Site + sitesByHost map[string]*site.Site +} + +func NewSiteIndex() *SiteIndex { + var siteIndex SiteIndex + siteIndex.sites = make(map[string]*site.Site) + siteIndex.sitesByHost = make(map[string]*site.Site) + return &siteIndex +} + +func (s *SiteIndex) GetSiteByHost(host string) *site.Site { + s.mu.RLock() + defer s.mu.RUnlock() + + return s.sitesByHost[host] +} + +func (s *SiteIndex) GetSite(site string) *site.Site { + s.mu.RLock() + defer s.mu.RUnlock() + + return s.sites[site] +} + +func (s *SiteIndex) GetSites() []*site.Site { + s.mu.RLock() + defer s.mu.RUnlock() + + sites := slices.Collect(maps.Values(s.sites)) + sort.Slice(sites, func(i, j int) bool { + return sites[i].Name < sites[j].Name + }) + return sites +} + +func (s *SiteIndex) AddSite(site *site.Site) { + s.mu.Lock() + defer s.mu.Unlock() + + s.sites[site.Name] = site + s.updateSiteIndexes() +} + +func (s *SiteIndex) updateSiteIndexes() { + clear(s.sitesByHost) + for _, site := range s.sites { + s.sitesByHost[site.SiteConfig.Host] = site + } +} |
