- loader.go with go:embed definitions/*.yaml for compile-time embedding - registry.go with List(), Get(), Stats(), AC() methods - Aho-Corasick automaton built from all provider keywords at NewRegistry() - pkg/providers/definitions/ with 3 YAML files for embed - All 5 provider tests pass: load, get, stats, AC, schema validation
38 lines
836 B
Go
38 lines
836 B
Go
package providers
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"io/fs"
|
|
"path/filepath"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
//go:embed definitions/*.yaml
|
|
var definitionsFS embed.FS
|
|
|
|
// loadProviders reads all YAML files from the embedded definitions FS.
|
|
func loadProviders() ([]Provider, error) {
|
|
var providers []Provider
|
|
err := fs.WalkDir(definitionsFS, "definitions", func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if d.IsDir() || filepath.Ext(path) != ".yaml" {
|
|
return nil
|
|
}
|
|
data, err := definitionsFS.ReadFile(path)
|
|
if err != nil {
|
|
return fmt.Errorf("reading provider file %s: %w", path, err)
|
|
}
|
|
var p Provider
|
|
if err := yaml.Unmarshal(data, &p); err != nil {
|
|
return fmt.Errorf("parsing provider %s: %w", path, err)
|
|
}
|
|
providers = append(providers, p)
|
|
return nil
|
|
})
|
|
return providers, err
|
|
}
|