| package subscription |
|
|
| import ( |
| "errors" |
| "fmt" |
|
|
| "github.com/openmeterio/openmeter/pkg/models" |
| "github.com/openmeterio/openmeter/pkg/treex" |
| ) |
|
|
| type fieldDescriptorMapping string |
|
|
| const ( |
| PhaseDescriptor fieldDescriptorMapping = "phase" |
| ) |
|
|
| |
| |
| func MapSubscriptionSpecValidationIssueField(iss models.ValidationIssue) (models.ValidationIssue, error) { |
| |
| var mappedField *models.FieldDescriptor |
| field := iss.Field() |
|
|
| if field == nil { |
| return iss, nil |
| } |
|
|
| err := field.Tree(func(t *models.FieldDescriptorTree) error { |
| err := t.DFS(func(n *treex.Node[*models.FieldDescriptor]) (bool, error) { |
| desc := n.Value() |
|
|
| |
| if desc == nil { |
| return false, errors.New("field descriptor is nil") |
| } |
|
|
| return mapPhaseDescriptor(t, desc) |
| }) |
| if err != nil { |
| return err |
| } |
|
|
| |
| mappedField = t.Root().Value().Clone() |
|
|
| return nil |
| }) |
| if err != nil { |
| return iss, err |
| } |
|
|
| return iss.WithField(mappedField), nil |
| } |
|
|
| |
| func mapPhaseDescriptor(t *models.FieldDescriptorTree, current *models.FieldDescriptor) (bool, error) { |
| if attrs := current.GetAttributes(); attrs != nil { |
| if _, ok := attrs[PhaseDescriptor]; ok { |
| |
| leafs := make([]*models.FieldDescriptor, 0) |
|
|
| err := current.Tree(func(t *models.FieldDescriptorTree) error { |
| leafs = t.Leafs() |
|
|
| return nil |
| }) |
| if err != nil { |
| return false, err |
| } |
|
|
| if len(leafs) != 2 { |
| return false, fmt.Errorf("phase selector segment %s has %d leafs, expected 2", current.String(), len(leafs)) |
| } |
|
|
| phaseKey := leafs[1].String() |
|
|
| prunedAttrs := attrs.Clone() |
| delete(prunedAttrs, PhaseDescriptor) |
|
|
| mappedDesc := models.NewFieldSelector("phases"). |
| WithExpression(models.NewFieldAttrValue("key", phaseKey)). |
| WithAttributes(prunedAttrs) |
|
|
| |
| return true, t.Swap(current, mappedDesc) |
| } |
| } |
|
|
| return false, nil |
| } |
|
|