Add semantic configuration profile comparison
This commit is contained in:
@@ -44,6 +44,41 @@ type EffectivePipelineSourceRecord struct {
|
||||
Source string
|
||||
}
|
||||
|
||||
// EffectivePipelineValueRecord identifies one normalized, secret-free
|
||||
// effective configuration value. Values use deterministic compact JSON
|
||||
// representations so command output can be compared without raw YAML layout.
|
||||
type EffectivePipelineValueRecord struct {
|
||||
Path string
|
||||
Value string
|
||||
}
|
||||
|
||||
// EffectivePipelineValues projects a fully resolved pipeline into sorted
|
||||
// logical configuration values. Mappings are flattened, while sequences remain
|
||||
// atomic values. The projection uses the same normalized effective mapping as
|
||||
// config show and therefore excludes composition and family declarations.
|
||||
func EffectivePipelineValues(cfg *PipelineConfig) ([]EffectivePipelineValueRecord, error) {
|
||||
if cfg == nil {
|
||||
return nil, fmt.Errorf("pipeline config is required")
|
||||
}
|
||||
data, err := MarshalEffectivePipeline(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
document, err := parseCompositionBytes("effective pipeline", data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
records, err := document.compactSemanticRecords()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
values := make([]EffectivePipelineValueRecord, 0, len(records))
|
||||
for _, record := range records {
|
||||
values = append(values, EffectivePipelineValueRecord{Path: record.Path, Value: record.Value})
|
||||
}
|
||||
return values, nil
|
||||
}
|
||||
|
||||
// EffectivePipelineSources projects pipeline ownership after defaults and
|
||||
// optional family expansion. It never includes effective values or raw secret
|
||||
// material, only logical paths and source identifiers.
|
||||
|
||||
Reference in New Issue
Block a user