examples/sqs-consumer/main.go

// 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
}