| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | package errorsimport (	"fmt")func HasCode(err error, code int) bool {	if errWithCode, ok := err.(ErrorWithCode); ok {		return errWithCode.Code() == code	}	return false}type ErrorWithCode interface {	error	Code() int}type ErrorCode intfunc (code ErrorCode) Code() int {	return int(code)}func (code ErrorCode) Prefix() string {	return fmt.Sprintf("[Error 0x%04X] ", code.Code())}type AuthenticationError struct {	ErrorCode	AuthDetail interface{}}func NewAuthenticationError(detail interface{}) AuthenticationError {	return AuthenticationError{		ErrorCode:  1,		AuthDetail: detail,	}}func (err AuthenticationError) Error() string {	return fmt.Sprintf("%sInvalid auth %v", err.Prefix(), err.AuthDetail)}type ProtocolVersionError struct {	ErrorCode	Version int}func NewProtocolVersionError(version int) ProtocolVersionError {	return ProtocolVersionError{		ErrorCode: 2,		Version:   version,	}}func (err ProtocolVersionError) Error() string {	return fmt.Sprintf("%sInvalid version %d", err.Prefix(), err.Version)}type CorruptedPacketError struct {	ErrorCode}var corruptedPacketErrorInstance = CorruptedPacketError{ErrorCode: 3}func NewCorruptedPacketError() CorruptedPacketError {	return corruptedPacketErrorInstance}func (err CorruptedPacketError) Error() string {	return err.Prefix() + "Corrupted packet."}type IPFormatError struct {	ErrorCode	IP []byte}func NewIPFormatError(ip []byte) IPFormatError {	return IPFormatError{		ErrorCode: 4,		IP:        ip,	}}func (err IPFormatError) Error() string {	return fmt.Sprintf("%sInvalid IP %v", err.Prefix(), err.IP)}type ConfigurationError struct {	ErrorCode}var configurationErrorInstance = ConfigurationError{ErrorCode: 5}func NewConfigurationError() ConfigurationError {	return configurationErrorInstance}func (r ConfigurationError) Error() string {	return r.Prefix() + "Invalid configuration."}type InvalidOperationError struct {	ErrorCode	Operation string}func NewInvalidOperationError(operation string) InvalidOperationError {	return InvalidOperationError{		ErrorCode: 6,		Operation: operation,	}}func (r InvalidOperationError) Error() string {	return r.Prefix() + "Invalid operation: " + r.Operation}
 |