summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-24 18:22:39 +0300
committerPaul Buetow <paul@buetow.org>2026-05-24 18:22:39 +0300
commit950d103e714836da5667eff574dd51993dd1a204 (patch)
tree33632878798d2aad12e2c9cc454274ec83d9c173
parentd35742e8e5d551681834172d2a64d9789c8039b2 (diff)
fix(rpn): replace assignmentHandler strategy pattern with if/else chain (task 5k)
-rw-r--r--internal/rpn/rpn_parse.go74
-rw-r--r--internal/rpn/rpn_state.go2
2 files changed, 17 insertions, 59 deletions
diff --git a/internal/rpn/rpn_parse.go b/internal/rpn/rpn_parse.go
index af6ff90..92292ae 100644
--- a/internal/rpn/rpn_parse.go
+++ b/internal/rpn/rpn_parse.go
@@ -9,59 +9,6 @@ import (
"strings"
)
-// assignmentHandler manages all assignment strategies.
-// It delegates assignment parsing to specialized handlers for :=, =:, and = operators.
-type assignmentHandler struct {
- registry *assignmentRegistry
-}
-
-// assignmentRegistry maintains a registry of assignment strategies.
-type assignmentRegistry struct {
- strategies []AssignmentStrategy
-}
-
-// AssignmentStrategy represents a function that attempts to parse and handle an assignment.
-// Returns (result string, handled bool, error error).
-type AssignmentStrategy func(input string, r *RPN) (string, bool, error)
-
-// newAssignmentRegistry creates a new assignment strategy registry.
-func newAssignmentRegistry() *assignmentRegistry {
- return &assignmentRegistry{
- strategies: make([]AssignmentStrategy, 0),
- }
-}
-
-// register adds an assignment strategy to the registry.
-func (r *assignmentRegistry) register(strategy AssignmentStrategy) {
- r.strategies = append(r.strategies, strategy)
-}
-
-// parse attempts to parse input using registered strategies in order.
-func (r *assignmentRegistry) parse(input string, rn *RPN) (string, bool, error) {
- for _, strategy := range r.strategies {
- if result, handled, err := strategy(input, rn); handled {
- return result, true, err
- }
- }
- return "", false, nil
-}
-
-// newAssignmentHandler creates a new assignment handler with all strategies registered.
-func newAssignmentHandler() *assignmentHandler {
- h := &assignmentHandler{
- registry: newAssignmentRegistry(),
- }
- h.registry.register(handleAssignRight)
- h.registry.register(handleAssignLeft)
- h.registry.register(handleStandardAssign)
- return h
-}
-
-// handle attempts to parse input using registered assignment strategies.
-func (h *assignmentHandler) handle(input string, r *RPN) (string, bool, error) {
- return h.registry.parse(input, r)
-}
-
// handleAssignmentOp is the shared implementation for := and =: operators.
// Both share identical logic: check for operator, extract fields, try two
// orderings (value name, then name value), parse, set variable, evaluate remainder.
@@ -194,10 +141,23 @@ func (r *RPN) ParseAndEvaluate(input string) (string, error) {
}
r.mu.Unlock()
- // Handle assignment formats using the new assignment handler
- if assignmentResult, isAssignment, err := r.assignHandler.handle(input, r); err != nil {
- return "", fmt.Errorf("rpn: failed to handle assignment: %w", err)
- } else if isAssignment {
+ // Handle assignment formats: :=, =:, =
+ var assignmentResult string
+ var isAssignment bool
+ var assignmentErr error
+
+ assignmentResult, isAssignment, assignmentErr = handleAssignRight(input, r)
+ if !isAssignment {
+ assignmentResult, isAssignment, assignmentErr = handleAssignLeft(input, r)
+ }
+ if !isAssignment {
+ assignmentResult, isAssignment, assignmentErr = handleStandardAssign(input, r)
+ }
+
+ if assignmentErr != nil {
+ return "", fmt.Errorf("rpn: failed to handle assignment: %w", assignmentErr)
+ }
+ if isAssignment {
return assignmentResult, nil
}
diff --git a/internal/rpn/rpn_state.go b/internal/rpn/rpn_state.go
index fc64535..adcf449 100644
--- a/internal/rpn/rpn_state.go
+++ b/internal/rpn/rpn_state.go
@@ -16,7 +16,6 @@ type RPN struct {
consts ConstantsProvider
ops OperationsProvider
opRegistry *OperatorRegistry
- assignHandler *assignmentHandler
maxStack int
currentStack *Stack
}
@@ -33,7 +32,6 @@ func NewRPN(vars VariableStore, reg ...*MetricRegistry) *RPN {
consts: consts,
ops: ops,
opRegistry: NewOperatorRegistry(ops),
- assignHandler: newAssignmentHandler(),
maxStack: 1000, // Reasonable limit for RPN expressions
currentStack: NewStack(),
}