func (msg *Message) Reject(requeue bool) error {
	if !msg.IsAckable {
		return errors.New("can't reject, not an ackable message")
	}
	if msg.amqpChan == nil {
		return errors.New("can't reject, internal channel is nil")
	}
	return msg.amqpChan.Reject(msg.deliveryTag, requeue)
}
Reject allows for you to reject on the original channel it was received.
Will fail if channel is closed and this is by design per RabbitMQ server.
package models
import (
	"errors"
	"fmt"
	"time"
	"github.com/streadway/amqp"
)
type Notification struct {
	LetterID     uint64
	FailedLetter *Letter
	Success      bool
	Error        error
}
func (not *Notification) ToString() string {
	if not.Success {
		return fmt.Sprintf("[LetterID: %d] - Successful.\r\n", not.LetterID)
	}
	return fmt.Sprintf("[LetterID: %d] - Failed.\r\nError: %s\r\n", not.LetterID, not.Error.Error())
}
type Message struct {
	IsAckable   bool
	Body        []byte
	deliveryTag uint64
	amqpChan    *amqp.Channel
}
func NewMessage(
	isAckable bool,
	body []byte,
	deliveryTag uint64,
	amqpChan *amqp.Channel) *Message {
	return &Message{
		IsAckable:   isAckable,
		Body:        body,
		deliveryTag: deliveryTag,
		amqpChan:    amqpChan,
	}
}
func (msg *Message) Acknowledge() error {
	if !msg.IsAckable {
		return errors.New("can't acknowledge, not an ackable message")
	}
	if msg.amqpChan == nil {
		return errors.New("can't acknowledge, internal channel is nil")
	}
	return msg.amqpChan.Ack(msg.deliveryTag, false)
}
func (msg *Message) Nack(requeue bool) error {
	if !msg.IsAckable {
		return errors.New("can't nack, not an ackable message")
	}
	if msg.amqpChan == nil {
		return errors.New("can't nack, internal channel is nil")
	}
	return msg.amqpChan.Nack(msg.deliveryTag, false, requeue)
}