68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
|
package eth
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
ErrMsgTooLarge = iota
|
||
|
ErrDecode
|
||
|
ErrInvalidMsgCode
|
||
|
ErrProtocolVersionMismatch
|
||
|
ErrNetworkIdMismatch
|
||
|
ErrGenesisBlockMismatch
|
||
|
ErrNoStatusMsg
|
||
|
ErrExtraStatusMsg
|
||
|
ErrInvalidBlock
|
||
|
)
|
||
|
|
||
|
var errorToString = map[int]string{
|
||
|
ErrMsgTooLarge: "Message too long",
|
||
|
ErrDecode: "Invalid message",
|
||
|
ErrInvalidMsgCode: "Invalid message code",
|
||
|
ErrProtocolVersionMismatch: "Protocol version mismatch",
|
||
|
ErrNetworkIdMismatch: "NetworkId mismatch",
|
||
|
ErrGenesisBlockMismatch: "Genesis block mismatch",
|
||
|
ErrNoStatusMsg: "No status message",
|
||
|
ErrExtraStatusMsg: "Extra status message",
|
||
|
ErrInvalidBlock: "Invalid block",
|
||
|
}
|
||
|
|
||
|
type protocolError struct {
|
||
|
Code int
|
||
|
fatal bool
|
||
|
message string
|
||
|
format string
|
||
|
params []interface{}
|
||
|
// size int
|
||
|
}
|
||
|
|
||
|
func newProtocolError(code int, format string, params ...interface{}) *protocolError {
|
||
|
return &protocolError{Code: code, format: format, params: params}
|
||
|
}
|
||
|
|
||
|
func ProtocolError(code int, format string, params ...interface{}) (err *protocolError) {
|
||
|
err = newProtocolError(code, format, params...)
|
||
|
// report(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (self protocolError) Error() (message string) {
|
||
|
message = self.message
|
||
|
if message == "" {
|
||
|
message, ok := errorToString[self.Code]
|
||
|
if !ok {
|
||
|
panic("invalid error code")
|
||
|
}
|
||
|
if self.format != "" {
|
||
|
message += ": " + fmt.Sprintf(self.format, self.params...)
|
||
|
}
|
||
|
self.message = message
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (self *protocolError) Fatal() bool {
|
||
|
return self.fatal
|
||
|
}
|