Files
gotenberg/internal/pkg/xcontext/xcontext.go
Julien Neuhart 7bfbda4490 huge refactoring
2019-07-23 13:57:18 +02:00

57 lines
1.6 KiB
Go

package xcontext
import (
"context"
"fmt"
"strings"
"github.com/thecodingmachine/gotenberg/internal/pkg/xerror"
"github.com/thecodingmachine/gotenberg/internal/pkg/xlog"
"github.com/thecodingmachine/gotenberg/internal/pkg/xtime"
)
// WithTimeout creates a context.Context which
// times out after given seconds.
func WithTimeout(logger xlog.Logger, seconds float64) (context.Context, context.CancelFunc) {
const op string = "xcontext.WithTimeout"
logger.DebugfOp(op, "creating context with '%.2fs' of timeout...", seconds)
return context.WithTimeout(context.Background(), xtime.Duration(seconds))
}
/*
MustHandleError checks if there is an error
in the given Context.
If no error, returns the previous error.
If context.DeadlineExceeded, wraps the previous
error inside an xerror.Error with xerror.TimeoutCode.
Otherwise wraps the previous error inside an
xerror.Error.
It panics if no previous error.
*/
func MustHandleError(ctx context.Context, previousErr error) error {
const op string = "xcontext.MustHandleError"
if previousErr == nil {
panic(fmt.Sprintf("%s: previous error should not be nil", op))
}
err := ctx.Err()
if err == nil {
// we do not wrap the previous error
// as it should be wrapped by the caller.
return previousErr
}
// context has timed out
if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) {
return xerror.Timeout(op, "context has timed out", previousErr)
}
/*
context has another error: we do not
wrap the error from the Context as the previous
error should contain it.
*/
return xerror.New(op, previousErr)
}