mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-07 21:19:51 +00:00
53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package nodeprocessor
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/usual2970/certimate/internal/domain"
|
|
"github.com/usual2970/certimate/internal/domain/expr"
|
|
)
|
|
|
|
type conditionNode struct {
|
|
node *domain.WorkflowNode
|
|
*nodeProcessor
|
|
*nodeOutputer
|
|
}
|
|
|
|
func NewConditionNode(node *domain.WorkflowNode) *conditionNode {
|
|
return &conditionNode{
|
|
node: node,
|
|
nodeProcessor: newNodeProcessor(node),
|
|
nodeOutputer: newNodeOutputer(),
|
|
}
|
|
}
|
|
|
|
func (n *conditionNode) Process(ctx context.Context) error {
|
|
nodeCfg := n.node.GetConfigForCondition()
|
|
if nodeCfg.Expression == nil {
|
|
n.logger.Info("without any conditions, enter this branch")
|
|
return nil
|
|
}
|
|
|
|
rs, err := n.evalExpr(ctx, nodeCfg.Expression)
|
|
if err != nil {
|
|
n.logger.Warn(fmt.Sprintf("failed to eval condition expression: %w", err))
|
|
return err
|
|
}
|
|
|
|
if rs.Value == false {
|
|
n.logger.Info("condition not met, skip this branch")
|
|
return errors.New("condition not met") // TODO: 错误处理
|
|
} else {
|
|
n.logger.Info("condition met, enter this branch")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (n *conditionNode) evalExpr(ctx context.Context, expression expr.Expr) (*expr.EvalResult, error) {
|
|
variables := GetNodeOutputs(ctx)
|
|
return expression.Eval(variables)
|
|
}
|