You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: error.rs
    path of file: ./repos/veloren/network/protocol/src
    
    the code of the file until where you have to start completion: /// All possible Errors that can happen during Handshake [`InitProtocol`]
///
/// [`InitProtocol`]: crate::InitProtocol
#[derive(Debug, PartialEq, Eq)]
pub enum InitProtocolError<E: std::fmt::Debug + Send> {
    Custom(E),
    /// expected Handshake, didn't get handshake
    NotHandshake,
    /// expected Id, didn't get id
    NotId,
    WrongMagicNumber([u8; 7]),
    WrongVersion([u32; 3]),
}

/// When you return closed you must stay closed!
#[derive(Debug, PartialEq, Eq)]
pub enum ProtocolError<E: std::fmt::Debug + Send> {
    /// Custom Error on the underlying I/O,
    /// e.g. the TCP, UDP or MPSC connection is dropped by the OS
    Custom
    
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        match self {
            InitProtocolError::Custom(e) => write!(f, "custom: {:?}", e),
            InitProtocolError::NotHandshake => write!(
                f,
                "Remote send something which couldn't be parsed as a handshake"
            ),
            InitProtocolError::NotId => {
                write!(f, "Remote send something which couldn't be parsed as an id")
            },
            InitProtocolError::WrongMagicNumber(r) => write!(
                f,
                "Magic Number doesn't match, remote side send '{:?}' instead of '{:?}'",
                &r,
                &crate::types::VELOREN_MAGIC_NUMBER
            ),
            InitProtocolError::WrongVersion(r) => write!(
                f,
                "Network doesn't match, remote side send '{:?}' we are on '{:?}'",
                &r,
                &crate::types::VELOREN_NETWORK_VERSION
            ),
        }
    }