feat: extract set_fields rule forces Int fields on gff_json merge targets
build-binaries / build-binaries (pull_request) Successful in 2m41s
test-image / build-image (pull_request) Successful in 42s
test / test (pull_request) Successful in 1m34s

Glob targets now match via matchPathPattern, so one rule can cover
areas/*.are.json. set_fields runs after preserve/merge so the forced
value always wins.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 18:11:33 +02:00
co-authored by Claude Fable 5
parent 5ebef57160
commit 3f532e43d2
3 changed files with 148 additions and 14 deletions
+18
View File
@@ -281,6 +281,15 @@ type ExtractGFFJSONMergeRule struct {
Target string `json:"target" yaml:"target"`
PreserveFields []string `json:"preserve_fields" yaml:"preserve_fields"`
MergeLists []ExtractListMergeRule `json:"merge_lists" yaml:"merge_lists"`
SetFields []ExtractSetFieldRule `json:"set_fields" yaml:"set_fields"`
}
// ExtractSetFieldRule forces an Int field to a fixed value on every extract,
// overriding whatever the toolset saved. Fields absent from the extracted
// document are left absent.
type ExtractSetFieldRule struct {
Field string `json:"field" yaml:"field"`
Value int32 `json:"value" yaml:"value"`
}
type ExtractListMergeRule struct {
@@ -980,6 +989,12 @@ func validateExtractMergeConfig(config ExtractMergeConfig) []error {
seenTargets[normalized] = struct{}{}
}
for setIndex, setRule := range rule.SetFields {
if strings.TrimSpace(setRule.Field) == "" {
failures = append(failures, fmt.Errorf("%s.set_fields[%d].field must not be empty", prefix, setIndex))
}
}
for listIndex, listRule := range rule.MergeLists {
listPrefix := fmt.Sprintf("%s.merge_lists[%d]", prefix, listIndex)
if strings.TrimSpace(listRule.Field) == "" {
@@ -1346,6 +1361,9 @@ func normalizeConfig(cfg *Config) {
}
cfg.Extract.Merge.GFFJSON[i].Target = target
cfg.Extract.Merge.GFFJSON[i].PreserveFields = normalizeStringSlice(cfg.Extract.Merge.GFFJSON[i].PreserveFields)
for j := range cfg.Extract.Merge.GFFJSON[i].SetFields {
cfg.Extract.Merge.GFFJSON[i].SetFields[j].Field = strings.TrimSpace(cfg.Extract.Merge.GFFJSON[i].SetFields[j].Field)
}
for j := range cfg.Extract.Merge.GFFJSON[i].MergeLists {
cfg.Extract.Merge.GFFJSON[i].MergeLists[j].Field = strings.TrimSpace(cfg.Extract.Merge.GFFJSON[i].MergeLists[j].Field)
cfg.Extract.Merge.GFFJSON[i].MergeLists[j].KeyField = strings.TrimSpace(cfg.Extract.Merge.GFFJSON[i].MergeLists[j].KeyField)