@@ -8,6 +8,7 @@ import (
9 "path/filepath"
9 "path/filepath"
@@ -77,6 +78,41 @@ func loadProvidersFromCache(path string) ([]catwalk.Provider, error) {
77 return providers, nil
78 return providers, nil
81+func UpdateProviders(pathOrUrl string) error {
82+ var providers []catwalk.Provider
83+ pathOrUrl = cmp.Or(pathOrUrl, os.Getenv("CATWALK_URL"), defaultCatwalkURL)
86+ case pathOrUrl == "embedded":
87+ providers = embedded.GetAll()
88+ case strings.HasPrefix(pathOrUrl, "http://") || strings.HasPrefix(pathOrUrl, "https://"):
90+ providers, err = catwalk.NewWithURL(pathOrUrl).GetProviders()
92+ return fmt.Errorf("failed to fetch providers from Catwalk: %w", err)
95+ content, err := os.ReadFile(pathOrUrl)
97+ return fmt.Errorf("failed to read file: %w", err)
99+ if err := json.Unmarshal(content, &providers); err != nil {
100+ return fmt.Errorf("failed to unmarshal provider data: %w", err)
102+ if len(providers) == 0 {
103+ return fmt.Errorf("no providers found in the provided source")
107+ cachePath := providerCacheFileData()
108+ if err := saveProvidersInCache(cachePath, providers); err != nil {
109+ return fmt.Errorf("failed to save providers to cache: %w", err)
112+ slog.Info("Providers updated successfully", "count", len(providers), "from", pathOrUrl, "to", cachePath)
80func Providers(cfg *Config) ([]catwalk.Provider, error) {
116func Providers(cfg *Config) ([]catwalk.Provider, error) {
81 providerOnce.Do(func() {
117 providerOnce.Do(func() {
82 catwalkURL := cmp.Or(os.Getenv("CATWALK_URL"), defaultCatwalkURL)
118 catwalkURL := cmp.Or(os.Getenv("CATWALK_URL"), defaultCatwalkURL)