package calendar // mergeLayers folds an ordered layer stack into one raw celebration set. Later // layers override earlier ones field-by-field; a slug with Fields["suppress"] // == "true" is removed; variant sub-sections merge per variant. func mergeLayers(layers []Layer) map[string]RawCelebration { out := map[string]RawCelebration{} for _, layer := range layers { for slug, rc := range layer.Cels { if rc.Fields["suppress"] == "true" { delete(out, slug) continue } cur, ok := out[slug] if !ok { cur = RawCelebration{Fields: map[string]string{}, Variants: map[string]map[string]string{}} } else { cur = cloneRaw(cur) } for k, v := range rc.Fields { cur.Fields[k] = v } for variant, fields := range rc.Variants { if cur.Variants[variant] == nil { cur.Variants[variant] = map[string]string{} } for k, v := range fields { cur.Variants[variant][k] = v } } cur.Fields["layer"] = layer.ID // provenance: last writer out[slug] = cur } } return out } func cloneRaw(rc RawCelebration) RawCelebration { nf := make(map[string]string, len(rc.Fields)) for k, v := range rc.Fields { nf[k] = v } nv := make(map[string]map[string]string, len(rc.Variants)) for variant, fields := range rc.Variants { m := make(map[string]string, len(fields)) for k, v := range fields { m[k] = v } nv[variant] = m } return RawCelebration{Fields: nf, Variants: nv} }