@@ -8,6 +8,7 @@ import (
88 "os"
99 "path/filepath"
1010 "runtime"
11+ "strings"
1112 "sync"
1213 "time"
1314
@@ -77,6 +78,41 @@ func loadProvidersFromCache(path string) ([]catwalk.Provider, error) {
7778 return providers, nil
7879}
7980
81+func UpdateProviders(pathOrUrl string) error {
82+ var providers []catwalk.Provider
83+ pathOrUrl = cmp.Or(pathOrUrl, os.Getenv("CATWALK_URL"), defaultCatwalkURL)
84+
85+ switch {
86+ case pathOrUrl == "embedded":
87+ providers = embedded.GetAll()
88+ case strings.HasPrefix(pathOrUrl, "http://") || strings.HasPrefix(pathOrUrl, "https://"):
89+ var err error
90+ providers, err = catwalk.NewWithURL(pathOrUrl).GetProviders()
91+ if err != nil {
92+ return fmt.Errorf("failed to fetch providers from Catwalk: %w", err)
93+ }
94+ default:
95+ content, err := os.ReadFile(pathOrUrl)
96+ if err != nil {
97+ return fmt.Errorf("failed to read file: %w", err)
98+ }
99+ if err := json.Unmarshal(content, &providers); err != nil {
100+ return fmt.Errorf("failed to unmarshal provider data: %w", err)
101+ }
102+ if len(providers) == 0 {
103+ return fmt.Errorf("no providers found in the provided source")
104+ }
105+ }
106+
107+ cachePath := providerCacheFileData()
108+ if err := saveProvidersInCache(cachePath, providers); err != nil {
109+ return fmt.Errorf("failed to save providers to cache: %w", err)
110+ }
111+
112+ slog.Info("Providers updated successfully", "count", len(providers), "from", pathOrUrl, "to", cachePath)
113+ return nil
114+}
115+
80116func Providers(cfg *Config) ([]catwalk.Provider, error) {
81117 providerOnce.Do(func() {
82118 catwalkURL := cmp.Or(os.Getenv("CATWALK_URL"), defaultCatwalkURL)