You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: relay.go
    path of file: ./repos/plumber/backends/azure-servicebus
    
    the code of the file until where you have to start completion: package azure_servicebus

import (
	"context"

	servicebus "github.com/Azure/azure-service-bus-go"
	"github.com/pkg/errors"

	"github.com/batchcorp/plumber-schemas/build/go/protos/opts"
	"github.com/batchcorp/plumber-schemas/build/go/protos/records"

	"github.com/streamdal/plumber/backends/azure-servicebus/types"

	"github.com/streamdal/plumber/prometheus"
	"github.com/streamdal/plumber/validate"
)

func (a *AzureServiceBus) Relay(ctx context.Context, relayOpts *opts.RelayOptions, relayCh chan interface{}, errorCh chan<- *records.ErrorRecord) error {
	if err := validateRelayOpts(relayOpts); err != nil {
		return errors.Wrap(err, "invalid relay options")
	}

	var handler servicebus.HandlerFunc = func(ctx context.Context, msg *servicebus.Message) error {
		a.log.Debug("Writing message to relay channel")

		// This might be nil if no user properties were sent with the original mess
    
func (a *AzureServiceBus) Relay(ctx context.Context, relayOpts *opts.RelayOptions, relayCh chan interface{}, errorCh chan<- *records.ErrorRecord) error {
	if err := validateRelayOpts(relayOpts); err != nil {
		return errors.Wrap(err, "invalid relay options")
	}

	var handler servicebus.HandlerFunc = func(ctx context.Context, msg *servicebus.Message) error {
		a.log.Debug("Writing message to relay channel")

		// This might be nil if no user properties were sent with the original message
		if msg.UserProperties == nil {
			msg.UserProperties = make(map[string]interface{}, 0)
		}

		// Azure's Message struct does not include this information for some reason
		// Seems like it would be good to have. Prefixed with plumber to avoid collisions with user data
		if relayOpts.AzureServiceBus.Args.Queue != "" {
			msg.UserProperties["plumber_queue"] = relayOpts.AzureServiceBus.Args.Queue
		} else {
			msg.UserProperties["plumber_topic"] = relayOpts.AzureServiceBus.Args.Topic
			msg.UserProperties["plumber_subscription"] = relayOpts.AzureServiceBus.Args.SubscriptionName
		}

		prometheus.Incr("azure-servicebus-relay-consumer", 1)

		relayCh <- &types.RelayMessage{
			Value:   msg,
			Options: &types.RelayMessageOptions{},
		}

		defer msg.Complete(ctx)
		return nil
	}

	if relayOpts.AzureServiceBus.Args.Queue != "" {
		return a.relayQueue(ctx, handler, relayOpts)
	}

	return a.relayTopic(ctx, handler, relayOpts)
}