| 3558 | ) |
| 3559 | |
| 3560 | func (lhs *Statement) mod(op opType, rhs *Statement) error { |
| 3561 | cs := make([]Condition, len(lhs.Conditions)) |
| 3562 | copy(cs, lhs.Conditions) |
| 3563 | ra := lhs.RouteAction |
| 3564 | as := make([]Action, len(lhs.ModActions)) |
| 3565 | copy(as, lhs.ModActions) |
| 3566 | for _, x := range rhs.Conditions { |
| 3567 | var c Condition |
| 3568 | i := 0 |
| 3569 | for idx, y := range lhs.Conditions { |
| 3570 | if x.Type() == y.Type() { |
| 3571 | c = y |
| 3572 | i = idx |
| 3573 | break |
| 3574 | } |
| 3575 | } |
| 3576 | switch op { |
| 3577 | case ADD: |
| 3578 | if c != nil { |
| 3579 | return fmt.Errorf("condition %d is already set", x.Type()) |
| 3580 | } |
| 3581 | if cs == nil { |
| 3582 | cs = make([]Condition, 0, len(rhs.Conditions)) |
| 3583 | } |
| 3584 | cs = append(cs, x) |
| 3585 | case REMOVE: |
| 3586 | if c == nil { |
| 3587 | return fmt.Errorf("condition %d is not set", x.Type()) |
| 3588 | } |
| 3589 | cs = append(cs[:i], cs[i+1:]...) |
| 3590 | if len(cs) == 0 { |
| 3591 | cs = nil |
| 3592 | } |
| 3593 | case REPLACE: |
| 3594 | if c == nil { |
| 3595 | return fmt.Errorf("condition %d is not set", x.Type()) |
| 3596 | } |
| 3597 | cs[i] = x |
| 3598 | } |
| 3599 | } |
| 3600 | if rhs.RouteAction != nil && !reflect.ValueOf(rhs.RouteAction).IsNil() { |
| 3601 | switch op { |
| 3602 | case ADD: |
| 3603 | if lhs.RouteAction != nil && !reflect.ValueOf(lhs.RouteAction).IsNil() { |
| 3604 | return fmt.Errorf("route action is already set") |
| 3605 | } |
| 3606 | ra = rhs.RouteAction |
| 3607 | case REMOVE: |
| 3608 | if lhs.RouteAction == nil || reflect.ValueOf(lhs.RouteAction).IsNil() { |
| 3609 | return fmt.Errorf("route action is not set") |
| 3610 | } |
| 3611 | ra = nil |
| 3612 | case REPLACE: |
| 3613 | if lhs.RouteAction == nil || reflect.ValueOf(lhs.RouteAction).IsNil() { |
| 3614 | return fmt.Errorf("route action is not set") |
| 3615 | } |
| 3616 | ra = rhs.RouteAction |
| 3617 | } |