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:
michel
2026-07-19 00:09:17 +02:00
parent b149a8ecf2
commit e72c8a5c07
37 changed files with 482 additions and 433 deletions
+8 -11
View File
@@ -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 || {
+18 -23
View File
@@ -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) => {
+10 -4
View File
@@ -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 -33
View File
@@ -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!(