Files
spray/pkg/resource_provider.go
M09IcandClaude Opus 4.6 f4b8e61376 feat: add ResourceLoader for controllable resource loading
Mirrors gogo's ResourceLoader pattern. SDK spray engine sets it to
no-op after init, preventing RunWithArgs from reloading ports/fingers/templates.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
2026-06-16 03:17:14 -07:00

73 lines
1.7 KiB
Go

package pkg
import "sync"
// ResourceProvider supplies template/config bytes by logical name.
type ResourceProvider func(string) []byte
var resourceProvider struct {
sync.RWMutex
fn ResourceProvider
}
// SetResourceProvider installs an external template/config provider.
func SetResourceProvider(provider ResourceProvider) {
resourceProvider.Lock()
defer resourceProvider.Unlock()
resourceProvider.fn = provider
}
// ResetResourceProvider removes the external template/config provider.
func ResetResourceProvider() {
SetResourceProvider(nil)
}
var resourceLoader struct {
sync.RWMutex
fn func() error
}
// SetResourceLoader overrides the default resource loading strategy.
func SetResourceLoader(fn func() error) {
resourceLoader.Lock()
defer resourceLoader.Unlock()
resourceLoader.fn = fn
}
// LoadResources executes the configured resource loader.
func LoadResources() error {
resourceLoader.RLock()
fn := resourceLoader.fn
resourceLoader.RUnlock()
if fn != nil {
return fn()
}
if err := LoadPorts(); err != nil {
return err
}
if err := LoadFingers(); err != nil {
return err
}
return LoadTemplates()
}
// LoadEmbeddedConfig loads the standalone embedded config without consulting
// an installed external provider.
func LoadEmbeddedConfig(typ string) []byte {
return loadEmbeddedConfig(typ)
}
// LoadConfig loads config bytes from the external provider first, then from
// the embedded templates kept for standalone spray compatibility.
func LoadConfig(typ string) []byte {
resourceProvider.RLock()
provider := resourceProvider.fn
resourceProvider.RUnlock()
if provider != nil {
if data := provider(typ); len(data) > 0 {
return data
}
}
return loadEmbeddedConfig(typ)
}