style: crank clippy to pedantic+nursery and fix all lints
Enable the full clippy all + pedantic + nursery groups as workspace warnings, with a small documented allow-list for the pedantic/nursery lints this project intentionally does not follow (rustdoc-style requirements, deliberate numeric casts in the protocol/UI layers, and a few noisy nursery lints). Also enable the rust unused_lifetimes and unsafe_op_in_unsafe_fn lints. Fixed every resulting warning (527 -> 0) mechanically per clippy's suggestions: inline format args, const fns, item ordering, let-else, redundant clones, map_or, cast_lossless, Eq derives, associated-fn conversions for methods that never used self, and removing unnecessary Result wrappers whose call sites could never propagate an error. No runtime behavior changed; cargo fmt applied. cargo clippy --workspace --all-targets: 0 warnings. All tests pass.
This commit is contained in:
@@ -41,14 +41,14 @@ impl<M: Send> ActorHandle<M> {
|
||||
pub fn send(&self, msg: M) -> Result<(), String> {
|
||||
self.sender
|
||||
.send(ActorMessage::UserMessage(msg))
|
||||
.map_err(|e| format!("Failed to send message: {}", e))
|
||||
.map_err(|e| format!("Failed to send message: {e}"))
|
||||
}
|
||||
|
||||
/// Request actor to stop gracefully
|
||||
pub fn stop(&self) -> Result<(), String> {
|
||||
self.sender
|
||||
.send(ActorMessage::Stop)
|
||||
.map_err(|e| format!("Failed to send stop signal: {}", e))
|
||||
.map_err(|e| format!("Failed to send stop signal: {e}"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,16 +64,15 @@ pub struct ActorSystem {
|
||||
}
|
||||
|
||||
impl ActorSystem {
|
||||
pub fn new(thread_pool: Arc<ThreadPool>) -> Self {
|
||||
ActorSystem { thread_pool }
|
||||
#[must_use]
|
||||
pub const fn new(thread_pool: Arc<ThreadPool>) -> Self {
|
||||
Self { thread_pool }
|
||||
}
|
||||
|
||||
/// Spawn a new actor and return its handle
|
||||
pub fn spawn<A: Actor>(&self, mut actor: A) -> ActorHandle<A::Message> {
|
||||
let (sender, receiver) = channel::<ActorMessage<A::Message>>();
|
||||
let handle = ActorHandle {
|
||||
sender: sender.clone(),
|
||||
};
|
||||
let handle = ActorHandle { sender };
|
||||
|
||||
// Start the actor event loop on the thread pool
|
||||
self.thread_pool.execute(move || {
|
||||
@@ -86,7 +85,7 @@ impl ActorSystem {
|
||||
}
|
||||
|
||||
/// Spawn a new actor with initialization callback and return its handle
|
||||
/// The callback receives the actor handle before on_start is called
|
||||
/// The callback receives the actor handle before `on_start` is called
|
||||
pub fn spawn_with_handle<A: Actor, F>(
|
||||
&self,
|
||||
mut actor: A,
|
||||
@@ -96,9 +95,7 @@ impl ActorSystem {
|
||||
F: FnOnce(&mut A, ActorHandle<A::Message>) + Send + 'static,
|
||||
{
|
||||
let (sender, receiver) = channel::<ActorMessage<A::Message>>();
|
||||
let handle = ActorHandle {
|
||||
sender: sender.clone(),
|
||||
};
|
||||
let handle = ActorHandle { sender };
|
||||
let handle_for_init = handle.clone();
|
||||
|
||||
self.thread_pool.execute(move || {
|
||||
|
||||
@@ -52,6 +52,7 @@ pub struct PeerActor {
|
||||
}
|
||||
|
||||
impl PeerActor {
|
||||
#[must_use]
|
||||
pub fn new(
|
||||
peer: Peer,
|
||||
stream: Option<TcpStream>,
|
||||
@@ -135,9 +136,9 @@ impl PeerActor {
|
||||
msgs
|
||||
});
|
||||
|
||||
messages
|
||||
.iter()
|
||||
.for_each(|msg| self.handle_message(msg.clone()));
|
||||
for msg in &messages {
|
||||
self.handle_message(msg.clone());
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_message(&mut self, msg: PeerMessage) {
|
||||
@@ -210,14 +211,7 @@ impl PeerActor {
|
||||
username, token, allowed
|
||||
);
|
||||
|
||||
if !allowed {
|
||||
if let Some(reason_text) = reason {
|
||||
debug!(
|
||||
"[peer:{}] Transfer rejected: {} - token {}, waiting for TransferRequest...",
|
||||
username, reason_text, token
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if allowed {
|
||||
debug!(
|
||||
"[peer:{}] Transfer allowed, ready to connect with token {:}",
|
||||
username, token
|
||||
@@ -237,6 +231,11 @@ impl PeerActor {
|
||||
username, e
|
||||
);
|
||||
}
|
||||
} else if let Some(reason_text) = reason {
|
||||
debug!(
|
||||
"[peer:{}] Transfer rejected: {} - token {}, waiting for TransferRequest...",
|
||||
username, reason_text, token
|
||||
);
|
||||
}
|
||||
}
|
||||
PeerMessage::PlaceInQueueResponse { filename, place } => {
|
||||
@@ -267,7 +266,7 @@ impl PeerActor {
|
||||
match self.peer.write_safe() {
|
||||
Ok(mut p) => p.username = username,
|
||||
Err(e) => {
|
||||
error!("[peer_actor] SetUsername write: {}", e)
|
||||
error!("[peer_actor] SetUsername write: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -306,9 +305,8 @@ impl PeerActor {
|
||||
}
|
||||
|
||||
{
|
||||
let stream = match self.stream.as_mut() {
|
||||
Some(s) => s,
|
||||
None => return,
|
||||
let Some(stream) = self.stream.as_mut() else {
|
||||
return;
|
||||
};
|
||||
|
||||
match self.reader.read_from_socket(stream) {
|
||||
@@ -352,7 +350,7 @@ impl PeerActor {
|
||||
message
|
||||
.get_message_name(
|
||||
MessageType::Peer,
|
||||
message.get_message_code() as u32
|
||||
u32::from(message.get_message_code())
|
||||
)
|
||||
.map_err(|e| e.to_string())
|
||||
);
|
||||
@@ -381,12 +379,9 @@ impl PeerActor {
|
||||
|
||||
fn send_message(&mut self, message: Message) {
|
||||
let username = self.peer_username();
|
||||
let stream = match self.stream.as_mut() {
|
||||
Some(s) => s,
|
||||
None => {
|
||||
error!("Cannot send message: stream is None");
|
||||
return;
|
||||
}
|
||||
let Some(stream) = self.stream.as_mut() else {
|
||||
error!("Cannot send message: stream is None");
|
||||
return;
|
||||
};
|
||||
|
||||
trace!(
|
||||
@@ -456,7 +451,7 @@ impl PeerActor {
|
||||
};
|
||||
|
||||
let socket_addr =
|
||||
format!("{}:{}", host, port).parse::<std::net::SocketAddr>();
|
||||
format!("{host}:{port}").parse::<std::net::SocketAddr>();
|
||||
|
||||
match socket_addr {
|
||||
Ok(addr) => {
|
||||
|
||||
@@ -18,6 +18,7 @@ pub struct PeerRegistry {
|
||||
}
|
||||
|
||||
impl PeerRegistry {
|
||||
#[must_use]
|
||||
pub fn new(
|
||||
actor_system: Arc<ActorSystem>,
|
||||
client_channel: Sender<ClientOperation>,
|
||||
@@ -48,7 +49,7 @@ impl PeerRegistry {
|
||||
let mut peers = self
|
||||
.peers
|
||||
.lock_safe()
|
||||
.map_err(|e| format!("peer registry lock poisoned: {}", e))?;
|
||||
.map_err(|e| format!("peer registry lock poisoned: {e}"))?;
|
||||
// Stop any actor already registered under this username so it does not
|
||||
// become an orphan pinning a pool worker forever (and so its later
|
||||
// shutdown cannot remove this new connection from the registry).
|
||||
@@ -64,6 +65,7 @@ impl PeerRegistry {
|
||||
Ok(handle)
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn get_peer(&self, username: &str) -> Option<ActorHandle<PeerMessage>> {
|
||||
match self.peers.lock_safe() {
|
||||
Ok(peers) => peers.get(username).cloned(),
|
||||
@@ -74,6 +76,7 @@ impl PeerRegistry {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn remove_peer(
|
||||
&self,
|
||||
username: &str,
|
||||
@@ -94,6 +97,7 @@ impl PeerRegistry {
|
||||
handle
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn get_all_usernames(&self) -> Vec<String> {
|
||||
match self.peers.lock_safe() {
|
||||
Ok(peers) => peers.keys().cloned().collect(),
|
||||
@@ -104,6 +108,7 @@ impl PeerRegistry {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn count(&self) -> usize {
|
||||
match self.peers.lock_safe() {
|
||||
Ok(peers) => peers.len(),
|
||||
@@ -114,6 +119,7 @@ impl PeerRegistry {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn contains(&self, username: &str) -> bool {
|
||||
match self.peers.lock_safe() {
|
||||
Ok(peers) => peers.contains_key(username),
|
||||
@@ -129,9 +135,9 @@ impl PeerRegistry {
|
||||
username: &str,
|
||||
message: PeerMessage,
|
||||
) -> Result<(), String> {
|
||||
let handle = self.get_peer(username).ok_or_else(|| {
|
||||
format!("Peer {} not found in registry", username)
|
||||
})?;
|
||||
let handle = self
|
||||
.get_peer(username)
|
||||
.ok_or_else(|| format!("Peer {username} not found in registry"))?;
|
||||
|
||||
handle.send(message)
|
||||
}
|
||||
|
||||
@@ -34,15 +34,18 @@ pub struct PeerAddress {
|
||||
}
|
||||
|
||||
impl PeerAddress {
|
||||
pub fn new(host: String, port: u16) -> Self {
|
||||
#[must_use]
|
||||
pub const fn new(host: String, port: u16) -> Self {
|
||||
Self { host, port }
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn get_host(&self) -> &str {
|
||||
&self.host
|
||||
}
|
||||
|
||||
pub fn get_port(&self) -> u16 {
|
||||
#[must_use]
|
||||
pub const fn get_port(&self) -> u16 {
|
||||
self.port
|
||||
}
|
||||
}
|
||||
@@ -59,6 +62,7 @@ pub struct Context {
|
||||
}
|
||||
|
||||
impl Context {
|
||||
#[must_use]
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
}
|
||||
@@ -72,7 +76,8 @@ pub struct UserMessage {
|
||||
new_message: bool,
|
||||
}
|
||||
impl UserMessage {
|
||||
pub fn new(
|
||||
#[must_use]
|
||||
pub const fn new(
|
||||
id: u32,
|
||||
timestamp: u32,
|
||||
username: String,
|
||||
@@ -143,6 +148,7 @@ pub struct ServerActor {
|
||||
}
|
||||
|
||||
impl ServerActor {
|
||||
#[must_use]
|
||||
pub fn new(
|
||||
address: PeerAddress,
|
||||
client_channel: Sender<ClientOperation>,
|
||||
@@ -166,11 +172,13 @@ impl ServerActor {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_address(&self) -> &PeerAddress {
|
||||
#[must_use]
|
||||
pub const fn get_address(&self) -> &PeerAddress {
|
||||
&self.address
|
||||
}
|
||||
|
||||
pub fn get_sender(&self) -> Option<&Sender<ServerMessage>> {
|
||||
#[must_use]
|
||||
pub const fn get_sender(&self) -> Option<&Sender<ServerMessage>> {
|
||||
self.dispatcher_sender.as_ref()
|
||||
}
|
||||
|
||||
@@ -178,7 +186,7 @@ impl ServerActor {
|
||||
let host = self.address.host.clone();
|
||||
let port = self.address.port;
|
||||
|
||||
let addr_str = format!("{}:{}", host, port);
|
||||
let addr_str = format!("{host}:{port}");
|
||||
|
||||
let mut socket_addrs = match addr_str.to_socket_addrs() {
|
||||
Ok(addrs) => addrs,
|
||||
@@ -197,7 +205,7 @@ impl ServerActor {
|
||||
|
||||
let Some(addr) = socket_addr else {
|
||||
let error_msg =
|
||||
format!("No socket addresses found for {}:{}", host, port);
|
||||
format!("No socket addresses found for {host}:{port}");
|
||||
error!("[server] {}", error_msg);
|
||||
self.disconnect_with_error(io::Error::new(
|
||||
io::ErrorKind::InvalidInput,
|
||||
@@ -280,9 +288,9 @@ impl ServerActor {
|
||||
msgs
|
||||
});
|
||||
|
||||
messages
|
||||
.iter()
|
||||
.for_each(|msg| self.handle_message(msg.clone()));
|
||||
for msg in &messages {
|
||||
self.handle_message(msg.clone());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn login(
|
||||
@@ -305,7 +313,7 @@ impl ServerActor {
|
||||
}
|
||||
|
||||
{
|
||||
logged_in = context.read_safe()?.logged_in
|
||||
logged_in = context.read_safe()?.logged_in;
|
||||
}
|
||||
|
||||
if logged_in.is_some() {
|
||||
@@ -341,15 +349,12 @@ impl ServerActor {
|
||||
|
||||
fn handle_message(&mut self, msg: ServerMessage) {
|
||||
if !matches!(self.connection_state, ConnectionState::Connected) {
|
||||
match &msg {
|
||||
ServerMessage::ProcessRead => {
|
||||
// Always process read operations
|
||||
}
|
||||
_ => {
|
||||
// Queue all other messages when not connected
|
||||
self.queued_messages.push(msg);
|
||||
return;
|
||||
}
|
||||
if matches!(&msg, ServerMessage::ProcessRead) {
|
||||
// Always process read operations
|
||||
} else {
|
||||
// Queue all other messages when not connected
|
||||
self.queued_messages.push(msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,7 +362,7 @@ impl ServerActor {
|
||||
ServerMessage::ConnectToPeer(peer) => {
|
||||
if let Some(op) = match peer.connection_type {
|
||||
ConnectionType::P | ConnectionType::F => {
|
||||
Some(ClientOperation::ConnectToPeer(peer.clone()))
|
||||
Some(ClientOperation::ConnectToPeer(peer))
|
||||
}
|
||||
ConnectionType::D => None,
|
||||
} && let Err(e) = self.client_channel.send(op)
|
||||
@@ -369,7 +374,7 @@ impl ServerActor {
|
||||
match self.context.write_safe() {
|
||||
Ok(mut ctx) => ctx.logged_in = Some(message),
|
||||
Err(e) => {
|
||||
error!("[server] LoginStatus write: {}", e)
|
||||
error!("[server] LoginStatus write: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -469,9 +474,8 @@ impl ServerActor {
|
||||
}
|
||||
|
||||
{
|
||||
let stream = match self.stream.as_mut() {
|
||||
Some(s) => s,
|
||||
None => return,
|
||||
let Some(stream) = self.stream.as_mut() else {
|
||||
return;
|
||||
};
|
||||
|
||||
match self.reader.read_from_socket(stream) {
|
||||
@@ -506,7 +510,7 @@ impl ServerActor {
|
||||
message
|
||||
.get_message_name(
|
||||
MessageType::Server,
|
||||
message.get_message_code() as u32
|
||||
u32::from(message.get_message_code())
|
||||
)
|
||||
.map_err(|e| e.to_string())
|
||||
);
|
||||
@@ -536,7 +540,7 @@ impl ServerActor {
|
||||
fn queue_message(&mut self, message: Message) {
|
||||
if let Some(sender) = &self.dispatcher_sender {
|
||||
match sender.send(ServerMessage::SendMessage(message)) {
|
||||
Ok(_) => {}
|
||||
Ok(()) => {}
|
||||
Err(e) => error!("Failed to send: {}", e),
|
||||
}
|
||||
} else {
|
||||
@@ -546,12 +550,9 @@ impl ServerActor {
|
||||
}
|
||||
|
||||
fn send_message(&mut self, message: Message) {
|
||||
let stream = match self.stream.as_mut() {
|
||||
Some(s) => s,
|
||||
None => {
|
||||
error!("[server] Cannot send message: stream is None");
|
||||
return;
|
||||
}
|
||||
let Some(stream) = self.stream.as_mut() else {
|
||||
error!("[server] Cannot send message: stream is None");
|
||||
return;
|
||||
};
|
||||
|
||||
trace!(
|
||||
|
||||
Reference in New Issue
Block a user