48 lines
1.9 KiB
Go
48 lines
1.9 KiB
Go
package consumers
|
|
|
|
import (
|
|
"io/fs"
|
|
"path/filepath"
|
|
|
|
configkit "go.maximumdirect.net/configkit"
|
|
)
|
|
|
|
// CompanionConfig demonstrates independently bundled and operator prompt tiers.
|
|
type CompanionConfig struct {
|
|
Mode string `yaml:"mode"`
|
|
Prompts []CompanionPrompt `yaml:"prompts"`
|
|
}
|
|
|
|
type CompanionPrompt struct {
|
|
ID string `yaml:"id"`
|
|
Text string `yaml:"text"`
|
|
Note string `yaml:"note"`
|
|
}
|
|
|
|
// LoadCompanionConfig discovers a main file and binds operator imports and the
|
|
// selected overlay to its directory while retaining the embedded catalog tier.
|
|
func LoadCompanionConfig(mainPath, overlay string) (*configkit.Result[CompanionConfig], error) {
|
|
files, err := fs.Sub(bundledFiles, "testdata/main-relative-bundle")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
bundle := configkit.NewFilesystem("bundled catalog", files)
|
|
absolute, err := filepath.Abs(mainPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
declarations := map[string]any{"config": map[string]any{"imports": []any{
|
|
map[string]any{"path": "prompts.yml", "destination": []any{"prompts"}, "placement": "sequence-item"},
|
|
map[string]any{"dir": "operator", "recursive": true, "pattern": []any{"*.yml", "*.yaml"}, "destination": []any{"prompts"}, "placement": "sequence-item"},
|
|
}}}
|
|
main := configkit.SearchConfig("", configkit.Searches(configkit.SearchPaths(absolute)), configkit.SearchOptions{Required: true})
|
|
return configkit.LoadLayered(configkit.Input{Source: main}, configkit.LayeredOptions[CompanionConfig]{
|
|
Underlays: []configkit.Underlay{
|
|
{Inputs: []configkit.Input{{Source: bundle.File("catalog.yml")}}},
|
|
{Inputs: []configkit.Input{{Source: configkit.Mapping("operator imports", declarations), Imports: true, MainRelative: configkit.MainRelative()}}},
|
|
},
|
|
Overlay: overlay,
|
|
Definition: configkit.Definition[CompanionConfig]{SequenceIdentities: []configkit.SequenceIdentity{configkit.SequenceIdentityAt(configkit.Keys("prompts"), "id")}},
|
|
})
|
|
}
|