Skip to content

Commit

Permalink
Merge pull request #848 from checkmarble/feat/make-validation-able-to…
Browse files Browse the repository at this point in the history
…-validate-against-no-type

feat: make ast validation without type show no type error
  • Loading branch information
ChibiBlasphem authored Feb 18, 2025
2 parents 57c9691 + e1ec1d4 commit ebd8a0c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
6 changes: 3 additions & 3 deletions api/handle_scenarios.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,13 @@ func validateScenarioAst(uc usecases.Usecases) func(c *gin.Context) {
return
}

expectedReturnType := "bool"
expectedReturnType := make([]string, 0, 1)
if input.ExpectedReturnType != "" {
expectedReturnType = input.ExpectedReturnType
expectedReturnType[0] = input.ExpectedReturnType
}

usecase := usecasesWithCreds(ctx, uc).NewScenarioUsecase()
astValidation, err := usecase.ValidateScenarioAst(ctx, scenarioId, &astNode, expectedReturnType)
astValidation, err := usecase.ValidateScenarioAst(ctx, scenarioId, &astNode, expectedReturnType...)

if presentError(ctx, c, err) {
return
Expand Down
4 changes: 2 additions & 2 deletions usecases/scenario_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ func validateScenarioUpdate(scenario models.Scenario, input models.UpdateScenari
}

func (usecase *ScenarioUsecase) ValidateScenarioAst(ctx context.Context,
scenarioId string, astNode *ast.Node, expectedReturnType string,
scenarioId string, astNode *ast.Node, expectedReturnType ...string,
) (validation ast.NodeEvaluation, err error) {
scenario, err := usecase.scenarioFetcher.FetchScenario(ctx,
usecase.executorFactory.NewExecutor(), scenarioId)
Expand All @@ -161,7 +161,7 @@ func (usecase *ScenarioUsecase) ValidateScenarioAst(ctx context.Context,
return validation, err
}

validation, err = usecase.validateScenarioAst.Validate(ctx, scenario, astNode, expectedReturnType)
validation, err = usecase.validateScenarioAst.Validate(ctx, scenario, astNode, expectedReturnType...)

return validation, err
}
Expand Down
25 changes: 14 additions & 11 deletions usecases/scenarios/scenario_validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ func (self *ValidateScenarioIterationImpl) Validate(ctx context.Context,

type ValidateScenarioAst interface {
Validate(ctx context.Context, scenario models.Scenario, astNode *ast.Node,
expectedReturnType string) (ast.NodeEvaluation, error)
expectedReturnType ...string) (ast.NodeEvaluation, error)
}

type ValidateScenarioAstImpl struct {
Expand All @@ -246,25 +246,28 @@ type ValidateScenarioAstImpl struct {
func (self *ValidateScenarioAstImpl) Validate(ctx context.Context,
scenario models.Scenario,
astNode *ast.Node,
expectedReturnTypeStr string,
expectedReturnTypeStr ...string,
) (ast.NodeEvaluation, error) {
dryRunEnvironment, err := self.AstValidator.MakeDryRunEnvironment(ctx, scenario)
if err != nil {
return ast.NodeEvaluation{}, err.Error
}

expectedReturnType, ok := getTypeFromString(expectedReturnTypeStr)
if !ok {
return ast.NodeEvaluation{}, errors.Wrapf(models.BadParameterError,
"unknown specified type '%s'", expectedReturnTypeStr)
}

astEvaluation, _ := ast_eval.EvaluateAst(ctx, nil, dryRunEnvironment, *astNode)
astEvaluationReturnType := reflect.TypeOf(astEvaluation.ReturnValue)

if len(astEvaluation.FlattenErrors()) == 0 && astEvaluationReturnType != expectedReturnType {
astEvaluation.Errors = append(astEvaluation.Errors, errors.Wrapf(models.BadParameterError,
"ast node does not return a %s", expectedReturnTypeStr))
if len(expectedReturnTypeStr) == 1 {
expectedReturnType, ok := getTypeFromString(expectedReturnTypeStr[0])
if !ok {
return ast.NodeEvaluation{}, errors.Wrapf(models.BadParameterError,
"unknown specified type '%s'", expectedReturnTypeStr)
}

if len(astEvaluation.FlattenErrors()) == 0 &&
astEvaluationReturnType != expectedReturnType {
astEvaluation.Errors = append(astEvaluation.Errors, errors.Wrapf(models.BadParameterError,
"ast node does not return a %s", expectedReturnTypeStr))
}
}

return astEvaluation, nil
Expand Down

0 comments on commit ebd8a0c

Please sign in to comment.