1package exec
2
3import (
4	"context"
5
6	"code.cloudfoundry.org/lager"
7	"code.cloudfoundry.org/lager/lagerctx"
8)
9
10const AbortedLogMessage = "interrupted"
11const TimeoutLogMessage = "timeout exceeded"
12
13type LogErrorStepDelegate interface {
14	Errored(lager.Logger, string)
15}
16
17type LogErrorStep struct {
18	Step
19
20	delegate LogErrorStepDelegate
21}
22
23func LogError(step Step, delegate LogErrorStepDelegate) Step {
24	return LogErrorStep{
25		Step: step,
26
27		delegate: delegate,
28	}
29}
30
31func (step LogErrorStep) Run(ctx context.Context, state RunState) error {
32	logger := lagerctx.FromContext(ctx)
33
34	runErr := step.Step.Run(ctx, state)
35
36	var message string
37	switch runErr {
38	case nil:
39		return nil
40	case context.Canceled:
41		message = AbortedLogMessage
42	case context.DeadlineExceeded:
43		message = TimeoutLogMessage
44	default:
45		message = runErr.Error()
46	}
47
48	logger.Info("errored", lager.Data{"error": runErr.Error()})
49
50	step.delegate.Errored(logger, message)
51
52	return runErr
53}
54