diff options
| author | Max Audron <me@audron.dev> | 2026-02-21 17:48:06 +0100 |
|---|---|---|
| committer | Max Audron <me@audron.dev> | 2026-02-21 17:48:06 +0100 |
| commit | cc542048e369dda0a773e1e3a4601dc7d20ff16a (patch) | |
| tree | ee3a23a88c0cb39cf222b871932636a2c912dd92 /src/session.rs | |
| parent | handshare and signalproxy/rpccall error handling (diff) | |
Syncable trait error handling
Diffstat (limited to 'src/session.rs')
| -rw-r--r-- | src/session.rs | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/src/session.rs b/src/session.rs index 6b00916..c30551e 100644 --- a/src/session.rs +++ b/src/session.rs @@ -13,6 +13,7 @@ use crate::message::StatefulSyncableServer; use log::{debug, error, warn}; use crate::{ + error::ProtocolError, message::{ objects::{Types, *}, Class, InitData, SessionInit, SyncMessage, Syncable, @@ -56,7 +57,7 @@ pub trait SessionManager { fn network_config(&mut self) -> &mut NetworkConfig; /// Handles an incoming [SyncMessage] and passes it on to the correct destination Object. - fn sync(&mut self, msg: SyncMessage) + fn sync(&mut self, msg: SyncMessage) -> Result<(), ProtocolError> where Self: Sized, { @@ -64,36 +65,41 @@ pub trait SessionManager { Class::AliasManager => self.alias_manager().sync(msg), Class::BacklogManager => self.backlog_manager().sync(msg), Class::BufferSyncer => self.buffer_syncer().sync(msg), - Class::BufferViewConfig => (), + Class::BufferViewConfig => Ok(()), Class::BufferViewManager => self.buffer_view_manager().sync(msg), Class::CoreInfo => self.core_info().sync(msg), // Synced via CoreInfo - Class::CoreData => (), + Class::CoreData => Ok(()), Class::HighlightRuleManager => self.highlight_rule_manager().sync(msg), Class::Identity => { let identity_id: i32 = msg.object_name.parse().unwrap(); if let Some(identity) = self.identity(identity_id as usize) { - identity.sync(msg); + identity.sync(msg)?; } else { warn!("could not find identity with id: {:?}", identity_id); } + Ok(()) } Class::IgnoreListManager => self.ignore_list_manager().sync(msg), Class::CertManager => self.cert_manager().sync(msg), Class::Network => { let id: i32 = msg.object_name.parse().unwrap(); if let Some(network) = self.network(id) { - network.sync(msg) + network.sync(msg)?; } + Ok(()) } // NetworkInfo does not receive SyncMessages directly but via Network - Class::NetworkInfo => (), + Class::NetworkInfo => Ok(()), Class::NetworkConfig => match msg.object_name.as_ref() { "GlobalNetworkConfig" => self.network_config().sync(msg), - _ => error!( - "received network config sync with unknown object name: {}", - msg.object_name - ), + _ => { + error!( + "received network config sync with unknown object name: {}", + msg.object_name + ); + Ok(()) + } }, Class::IrcChannel => { let mut object_name = msg.object_name.split('/'); @@ -120,6 +126,7 @@ pub trait SessionManager { mode, get_param!(msg), ); + Ok(()) } "removeChannelMode" => { let mut msg = msg.clone(); @@ -131,13 +138,13 @@ pub trait SessionManager { .get_mut(channel) .unwrap() .remove_channel_mode(mode_type, mode, get_param!(msg)); + Ok(()) } _ => network.irc_channels.get_mut(channel).unwrap().sync(msg.clone()), - } + }?; } - } else { - warn!("Could not find Network {:?}", network_id) } + Ok(()) } Class::IrcUser => { let mut object_name = msg.object_name.split('/'); @@ -148,17 +155,19 @@ pub trait SessionManager { if let Some(network) = self.network(network_id) { if let Some(user) = network.irc_users.get_mut(user) { - user.sync(msg); + user.sync(msg)?; // TODO we probably need to deal with the quit here? // and remove the user from the network } else { warn!("Could not find IrcUser {} in Network {:?}", user, network_id) } - } else { - warn!("Could not find Network {:?}", network_id) } + Ok(()) + } + Class::Unknown => { + warn!("received unknown object syncmessage: {:?}", msg); + Ok(()) } - Class::Unknown => warn!("received unknown object syncmessage: {:?}", msg), } } |
