// Command sqs-consumer demonstrates partial-batch failure handling. The
// user handler returns an error for any message whose body contains the
// substring "bad"; the adapter collects those ids into BatchItemFailures
// so SQS redelivers only the offending messages.
//
// See mercemay.top/src/lambdalog/examples/sqs-consumer/.
package main
import (
"context"
"errors"
"strings"
awslambda "github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/events"
adapter "mercemay.top/src/lambdalog/adapters/sqs"
)
type logger struct{}
func (logger) Info(string, ...adapter.Field) {}
func (logger) Error(string, ...adapter.Field) {}
func (logger) With(...adapter.Field) adapter.Logger { return logger{} }
var errBadMessage = errors.New("bad message")
func processMessage(ctx context.Context, m events.SQSMessage) error {
if strings.Contains(m.Body, "bad") {
return errBadMessage
}
// Real implementations would perform work here; the example just
// demonstrates acknowledging success.
return nil
}
func main() {
h := adapter.Handler(logger{}, processMessage)
awslambda.Start(h)
}
// summariseEvent is a helper used by the example's tests to describe an
// incoming batch without running the Lambda runtime.
func summariseEvent(evt events.SQSEvent) (ok, bad int) {
for _, m := range evt.Records {
if strings.Contains(m.Body, "bad") {
bad++
} else {
ok++
}
}
return ok, bad
}