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")}}, }) }