package app import ( "context" "git.alecodes.page/alecodes/miniflux-archiver/internal/logger" "git.alecodes.page/alecodes/miniflux-archiver/internal/miniflux" "git.alecodes.page/alecodes/miniflux-archiver/internal/service" "golang.org/x/sync/semaphore" ) func Archive(minifluxConfig miniflux.MinifluxConfig, serviceConfig service.ServiceConfig) { ctx := context.Background() mf, err := miniflux.NewMiniflux(minifluxConfig) if err != nil { logger.Fatal("Could not connect to the miniflux server: %v", err) } externalService, err := service.ResolveService(serviceConfig) if err != nil { logger.Fatal(err.Error()) } result, err := mf.GetEntries() if err != nil { logger.Fatal("Could not retrieve entries from the miniflux feed: %v", err) } sem := semaphore.NewWeighted(int64(serviceConfig.MaxRequests)) for _, entry := range result.Entries { if err := sem.Acquire(ctx, 1); err != nil { logger.Fatal("Failed to acquire semaphore: %v", err) } go func() { defer sem.Release(1) err := externalService.Archive(entry.URL) if err != nil { logger.Fatal("Could not archive url \"%v\" from the service: %v", entry.URL, err) } logger.Info("Url \"%v\" has been marked as read", entry.URL) }() } if err := sem.Acquire(ctx, int64(serviceConfig.MaxRequests)); err != nil { logger.Fatal("Failed to acquire semaphore: %v", err) } }