package updater import ( "context" "encoding/json" "fmt" "github.com/qdm12/gluetun-servers/pkg/models" ) func (u *Updater) updateProvider(ctx context.Context, providerName string, manifest manifest, minRatio float64, ) (err error) { providerFilepath := manifest.providerToFilepath[providerName] providerFileURL := buildProviderFileURL(providerName, providerFilepath) var data models.Servers err = u.fetchJSON(ctx, providerFileURL, &data) if err != nil { return fmt.Errorf("downloading provider file %s: %w", providerFileURL, err) } existingServersCount := u.storage.GetServersCount(providerName) minServers := int(minRatio * float64(existingServersCount)) servers := data.Servers if len(servers) < minServers { return fmt.Errorf("provider %s has not enough servers from downloaded file: got %d and expected at least %d", providerName, len(servers), minServers) } for _, server := range servers { err := server.HasMinimumInformation() if err != nil { serverJSON, jsonErr := json.Marshal(server) if jsonErr != nil { panic(jsonErr) } return fmt.Errorf("server %s has not enough information: %w", serverJSON, err) } } if u.storage.ServersAreEqual(providerName, servers) { return nil } // Note the servers variable must NOT BE MUTATED after this call, // since the implementation does not deep copy the servers. // TODO set in storage in provider updater directly, server by server, // to avoid accumulating server data in memory. err = u.storage.SetServers(providerName, servers) if err != nil { return fmt.Errorf("setting servers to storage: %w", err) } return nil }