go/mqtt/errors.go (93 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package mqtt
import "fmt"
// ClientState indicates the current state of the session client.
type ClientState byte
const (
// The session client has not yet been started.
NotStarted ClientState = iota
// The session client has been started and has not yet been stopped by the
// user or terminated due to a fatal error.
Started
// The session client has been stopped by the user or terminated due to a
// fatal error.
ShutDown
)
// ClientStateError is returned when the operation cannot proceed due to the
// state of the session client.
type ClientStateError struct {
State ClientState
}
func (e *ClientStateError) Error() string {
switch e.State {
case NotStarted:
return "the session client has not yet been started"
case Started:
return "the session client has already been started"
case ShutDown:
return "the session client has been shut down"
default:
// It should not be possible to get here.
return ""
}
}
// DisconnectError indicates that the session client received a DISCONNECT
// packet from the server with a reason code that is not deemed to be fatal.
// It is primarily used for internal tracking and should not be expected by
// users except in rare cases in logs.
type DisconnectError struct {
ReasonCode byte
}
func (e *DisconnectError) Error() string {
return fmt.Sprintf(
"received DISCONNECT packet with reason code 0x%x",
e.ReasonCode,
)
}
// FatalDisconnectError indicates that the session client has terminated due
// to receiving a DISCONNECT packet from the server with a reason code that
// is deemed to be fatal.
type FatalDisconnectError struct {
ReasonCode byte
}
func (e *FatalDisconnectError) Error() string {
return fmt.Sprintf(
"received DISCONNECT packet with fatal reason code 0x%x",
e.ReasonCode,
)
}
// SessionLostError indicates that the session client has terminated due to
// receiving a CONNACK with session present false when reconnecting.
type SessionLostError struct{}
func (*SessionLostError) Error() string {
return "expected server to have session information, but received a CONNACK packet with session present false"
}
// ConnectionError indicates that the session client has terminated due to an
// issue opening the network connection to the MQTT server. It may wrap an
// underlying error using Go standard error wrapping.
type ConnectionError struct {
message string
wrapped error
}
func (e *ConnectionError) Error() string {
if e.wrapped != nil {
return fmt.Sprintf("%s: %v", e.message, e.wrapped)
}
return e.message
}
func (e *ConnectionError) Unwrap() error {
return e.wrapped
}
// ConnackError indicates that the session client received a CONNACK with a
// reason code that indicates an error but is not deemed to be fatal. It may
// appear as a fatal error if it is the final error returned once the session
// client has exhausted its connection retries.
type ConnackError struct {
ReasonCode byte
}
func (e *ConnackError) Error() string {
return fmt.Sprintf(
"received CONNACK packet with error reason code 0x%x",
e.ReasonCode,
)
}
// FatalConnackError indicates that the session client has terminated due to
// receiving a CONNACK with with a reason code that is deemed to be fatal.
type FatalConnackError struct {
ReasonCode byte
}
func (e *FatalConnackError) Error() string {
return fmt.Sprintf(
"received CONNACK packet with fatal reason code 0x%x",
e.ReasonCode,
)
}
// InvalidArgumentError indicates that the user has provided an invalid value
// for an option. It may wrap an underlying error using Go standard error
// wrapping.
type InvalidArgumentError struct {
message string
wrapped error
}
func (e *InvalidArgumentError) Error() string {
if e.wrapped != nil {
return fmt.Sprintf("%s: %v", e.message, e.wrapped)
}
return e.message
}
func (e *InvalidArgumentError) Unwrap() error {
return e.wrapped
}
// PublishQueueFullError is returned if there are too many publishes enqueued
// and the session client is not accepting any more. This should very rarely
// occur, and if it does, it is a sign that either the connection is unstable
// or the application is sending messages at a faster rate than can be handled
// by the session client or server.
type PublishQueueFullError struct{}
func (*PublishQueueFullError) Error() string {
return "publish queue full"
}