use crate::types::{ClientId, ComponentKind, NetworkId};
#[derive(Debug, thiserror::Error)]
pub enum TransportError {
#[error("Client {0:?} is not connected")]
ClientNotConnected(ClientId),
#[error("Datagram exceeds MTU limit ({size} > {max})")]
PayloadTooLarge {
size: usize,
max: usize,
},
#[error("Transport I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Lock poisoned")]
LockPoisoned,
}
#[derive(Debug, thiserror::Error)]
pub enum EncodeError {
#[error("Buffer overflow: need {needed} bytes, have {available}")]
BufferOverflow {
needed: usize,
available: usize,
},
#[error("Malformed payload at byte offset {offset}: {message}")]
MalformedPayload {
offset: usize,
message: String,
},
#[error("Unknown component kind: {0:?}")]
UnknownComponent(ComponentKind),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}
#[derive(Debug, thiserror::Error)]
pub enum WorldError {
#[error("Entity {0:?} not found")]
EntityNotFound(NetworkId),
#[error("Entity {0:?} already exists")]
EntityAlreadyExists(NetworkId),
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::{Error as IoError, ErrorKind};
#[test]
fn test_error_displays() {
let err1 = TransportError::ClientNotConnected(ClientId(42));
assert_eq!(err1.to_string(), "Client ClientId(42) is not connected");
let err2 = TransportError::PayloadTooLarge {
size: 1500,
max: 1200,
};
assert_eq!(err2.to_string(), "Datagram exceeds MTU limit (1500 > 1200)");
let err3 = TransportError::Io(IoError::new(ErrorKind::ConnectionReset, "connection reset"));
assert_eq!(err3.to_string(), "Transport I/O error: connection reset");
let err4 = EncodeError::BufferOverflow {
needed: 256,
available: 128,
};
assert_eq!(
err4.to_string(),
"Buffer overflow: need 256 bytes, have 128"
);
let err5 = EncodeError::MalformedPayload {
offset: 10,
message: "unexpected EOF".to_string(),
};
assert_eq!(
err5.to_string(),
"Malformed payload at byte offset 10: unexpected EOF"
);
let err6 = EncodeError::UnknownComponent(ComponentKind(99));
assert_eq!(
err6.to_string(),
"Unknown component kind: ComponentKind(99)"
);
let err7 = WorldError::EntityNotFound(NetworkId(123));
assert_eq!(err7.to_string(), "Entity NetworkId(123) not found");
let err8 = WorldError::EntityAlreadyExists(NetworkId(456));
assert_eq!(err8.to_string(), "Entity NetworkId(456) already exists");
}
}