Add regex support for Replacement selectors (#5863)

* feat: Add regex support for Replacement selectors

* Add new tests for regex support

* Earlier exit with rejectAny, and fix linting

* Add example Use cases using regex
This commit is contained in:
zepard
2025-08-12 20:13:08 +02:00
committed by GitHub
parent f74736130c
commit 7c04cbb237
4 changed files with 2023 additions and 16 deletions

View File

@@ -66,6 +66,53 @@ type TargetSelector struct {
Options *FieldOptions `json:"options,omitempty" yaml:"options,omitempty"`
}
type TargetSelectorRegex struct {
targetSelector *TargetSelector
selectRegex *SelectorRegex
rejectRegex []*SelectorRegex
}
func NewTargetSelectorRegex(ts *TargetSelector) (*TargetSelectorRegex, error) {
tsr := new(TargetSelectorRegex)
tsr.targetSelector = ts
var err error
tsr.selectRegex, err = NewSelectorRegex(ts.Select)
if err != nil {
return nil, err
}
rej := []*SelectorRegex{}
for _, r := range ts.Reject {
rr, err := NewSelectorRegex(r)
if err != nil {
return nil, err
}
rej = append(rej, rr)
}
tsr.rejectRegex = rej
return tsr, nil
}
func (tsr *TargetSelectorRegex) Selects(id resid.ResId) bool {
return tsr.selectRegex.MatchGvk(id.Gvk) && tsr.selectRegex.MatchName(id.Name) && tsr.selectRegex.MatchNamespace(id.Namespace)
}
func (tsr *TargetSelectorRegex) RejectsAny(ids []resid.ResId) bool {
for _, r := range tsr.rejectRegex {
if r.selector.ResId.IsEmpty() {
continue
}
for _, id := range ids {
if r.MatchGvk(id.Gvk) && r.MatchName(id.Name) && r.MatchNamespace(id.Namespace) {
return true
}
}
}
return false
}
// FieldOptions refine the interpretation of FieldPaths.
type FieldOptions struct {
// Used to split/join the field.