| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | 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)}
 |