func()

in src/ulsp/controller/quick-actions/actions-java/action_java_test_run.go [42:94]


func (a *ActionJavaTestRun) Execute(ctx context.Context, params *action.ExecuteParams, args json.RawMessage) error {
	s, err := params.Sessions.GetFromContext(ctx)
	if err != nil {
		return fmt.Errorf("getting session from context: %w", err)
	}

	resultArgs := argsJavaTestRun{}
	err = json.Unmarshal(args, &resultArgs)
	if err != nil {
		return fmt.Errorf("unmarshalling args: %w", err)
	}

	// Command preparations set stdout and stderr to writer
	ideOutWriter, err := params.IdeGateway.GetLogMessageWriter(ctx, _commandJavaTestRun)
	if err != nil {
		return fmt.Errorf("getting writer: %w", err)
	}

	testCaseName := a.getTestCaseName(resultArgs)
	target, err := javautils.GetJavaTarget(params.FileSystem, s.WorkspaceRoot, resultArgs.Document.URI)
	if err != nil {
		return err
	}
	cmd, env := a.prepareCommandAndEnv(ctx, ideOutWriter, s.WorkspaceRoot, target, testCaseName, s.InitializeParams.ClientInfo.Name)

	err = params.IdeGateway.LogMessage(ctx, &protocol.LogMessageParams{
		Message: fmt.Sprintf(_startMessageJavaTestRun, strings.Join(cmd.Args, " ")),
		Type:    protocol.MessageTypeInfo,
	})
	if err != nil {
		return fmt.Errorf("logging message: %w", err)
	}

	// Command execution will go here
	err = params.Executor.RunCommand(cmd, env)
	if err != nil {
		// Log message even if context is already done.
		params.IdeGateway.LogMessage(context.WithoutCancel(ctx), &protocol.LogMessageParams{
			Message: fmt.Errorf("Error during run: %w", err).Error(),
			Type:    protocol.MessageTypeError,
		})
		return err
	}
	_, err = ideOutWriter.Write([]byte(_endMessage))
	if err != nil {
		return fmt.Errorf("logging message: %w", err)
	}

	return params.IdeGateway.ShowMessage(ctx, &protocol.ShowMessageParams{
		Message: fmt.Sprintf("Completed test %s", testCaseName),
		Type:    protocol.MessageTypeInfo,
	})
}