From cdb75d3fcbc9339b897f8c6ff4d69a577f017393 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Tue, 8 Jul 2025 23:26:05 +0100 Subject: Rewrite in Go --- pkg/index/index.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pkg/index/index.go (limited to 'pkg/index/index.go') 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 + } +} -- cgit v1.2.3-70-g09d2