@@ -116,9 +116,44 @@ type VarAssignment struct {
116116 Value string `yaml:"value"`
117117}
118118
119+ type VarOperation int
120+
121+ const (
122+ UnknownOp VarOperation = iota
123+ Assign
124+ Increment
125+ Decrement
126+ )
127+
128+ func (v VarOperation ) String () string {
129+ switch v {
130+ case Assign :
131+ return "="
132+ case Increment :
133+ return "=+"
134+ case Decrement :
135+ return "=-"
136+ default :
137+ return "unknown"
138+ }
139+ }
140+
141+ func stringToVarOperation (s string ) VarOperation {
142+ switch s {
143+ case "=" :
144+ return Assign
145+ case "=+" :
146+ return Increment
147+ case "=-" :
148+ return Decrement
149+ default :
150+ return UnknownOp
151+ }
152+ }
153+
119154type SetvarAction struct {
120155 Collection CollectionName `yaml:"collection,omitempty"`
121- Operation string `yaml:"operation,omitempty"`
156+ Operation VarOperation `yaml:"operation,omitempty"`
122157 Assignments []VarAssignment `yaml:"assignments,omitempty"`
123158}
124159
@@ -136,7 +171,7 @@ func (a SetvarAction) ToString() string {
136171 var result []string
137172 // Reconstruct the setvar actions
138173 for _ , asg := range a .Assignments {
139- result = append (result , SetVar .String ()+ ":" + a .Collection .String ()+ "." + asg .Variable + a .Operation + asg .Value )
174+ result = append (result , SetVar .String ()+ ":" + a .Collection .String ()+ "." + asg .Variable + a .Operation . String () + asg .Value )
140175 }
141176 return strings .Join (result , ", " )
142177}
@@ -154,7 +189,7 @@ func (a SetvarAction) GetAllParams() []string {
154189 var result []string
155190 // Get all the variables
156191 for _ , asg := range a .Assignments {
157- res := SetVar .String () + ":" + a .Collection .String () + "." + asg .Variable + a .Operation + asg .Value
192+ res := SetVar .String () + ":" + a .Collection .String () + "." + asg .Variable + a .Operation . String () + asg .Value
158193 result = append (result , res )
159194 }
160195 return result
@@ -168,10 +203,10 @@ func (s VarAssignment) MarshalYAML() (interface{}, error) {
168203}
169204
170205func (s SetvarAction ) MarshalYAML () (interface {}, error ) {
171- if s .Collection == UNKNOWN_COLLECTION || s .Operation == "" || len (s .Assignments ) == 0 {
206+ if s .Collection == UNKNOWN_COLLECTION || s .Operation == UnknownOp || len (s .Assignments ) == 0 {
172207 return nil , fmt .Errorf ("invalid setvar action: missing collection name, operation, or assignments" )
173208 }
174- if s .Collection == TX && s .Operation == "=" {
209+ if s .Collection == TX && s .Operation == Assign {
175210 // Default case
176211 res := map [string ][]VarAssignment {}
177212 res ["setvar" ] = s .Assignments
@@ -190,7 +225,7 @@ func (s SetvarAction) MarshalYAML() (interface{}, error) {
190225 Assignments []VarAssignment
191226 }{
192227 Collection : s .Collection ,
193- Operation : s .Operation ,
228+ Operation : s .Operation . String () ,
194229 Assignments : s .Assignments ,
195230 }
196231 return res , nil
@@ -218,10 +253,13 @@ func NewActionWithParam[T ActionType](action T, param string) (ActionWithParam,
218253}
219254
220255// NewSetvarAction creates a new SetvarAction with the given collection name, operation, and variable assignments
221- func NewSetvarAction (collection CollectionName , operation string , vars []VarAssignment ) (SetvarAction , error ) {
256+ func NewSetvarAction (collection CollectionName , operation VarOperation , vars []VarAssignment ) (SetvarAction , error ) {
222257 if collection != GLOBAL && collection != IP && collection != RESOURCE && collection != SESSION && collection != TX && collection != USER {
223258 return SetvarAction {}, fmt .Errorf ("invalid setvar action: invalid collection name '%s'" , collection )
224259 }
260+ if operation == UnknownOp {
261+ return SetvarAction {}, fmt .Errorf ("invalid setvar action: invalid operation '%s'" , operation )
262+ }
225263 return SetvarAction {Collection : collection , Operation : operation , Assignments : vars }, nil
226264}
227265
@@ -529,12 +567,18 @@ func (s *SeclangActions) AddNonDisruptiveActionWithParam(action NonDisruptiveAct
529567// AddSetvarAction adds a setvar action to the NonDisruptiveActions list
530568func (s * SeclangActions ) AddSetvarAction (collection , variable , operation , value string ) error {
531569 colName := stringToCollectionName (strings .ToUpper (collection ))
570+
571+ op := stringToVarOperation (operation )
572+ if op == UnknownOp {
573+ return fmt .Errorf ("invalid setvar action: invalid operation '%s'" , operation )
574+ }
575+
532576 // Check if there is already a setvar action in the last position
533577 if len (s .NonDisruptiveActions ) > 0 {
534578 lastAction := s .NonDisruptiveActions [len (s .NonDisruptiveActions )- 1 ]
535- if lastAction .GetKey () != SetVar .String () || lastAction .(SetvarAction ).Collection != colName || lastAction .(SetvarAction ).Operation != operation {
579+ if lastAction .GetKey () != SetVar .String () || lastAction .(SetvarAction ).Collection != colName || lastAction .(SetvarAction ).Operation != op {
536580 // If the last action is not setvar, we need to create a new one
537- newAction , err := NewSetvarAction (colName , operation , []VarAssignment {{Variable : variable , Value : value }})
581+ newAction , err := NewSetvarAction (colName , op , []VarAssignment {{Variable : variable , Value : value }})
538582 if err != nil {
539583 return err
540584 }
@@ -553,7 +597,7 @@ func (s *SeclangActions) AddSetvarAction(collection, variable, operation, value
553597 }
554598 } else {
555599 // If there are no actions yet, we need to create a new setvar action
556- newAction , err := NewSetvarAction (colName , operation , []VarAssignment {{Variable : variable , Value : value }})
600+ newAction , err := NewSetvarAction (colName , op , []VarAssignment {{Variable : variable , Value : value }})
557601 if err != nil {
558602 return err
559603 }
0 commit comments