diff options
| -rw-r--r-- | Cargo.lock | 1 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/channel/app.rs | 49 |
3 files changed, 17 insertions, 34 deletions
@@ -749,7 +749,6 @@ dependencies = [ "serde", "serde_json", "sqlx", - "thiserror", "tokio", "tokio-stream", "uuid", @@ -18,7 +18,6 @@ rand_core = { version = "0.6.4", features = ["getrandom"] } serde = { version = "1.0.209", features = ["derive"] } serde_json = "1.0.128" sqlx = { version = "0.8.1", features = ["chrono", "runtime-tokio", "sqlite"] } -thiserror = "1.0.63" tokio = { version = "1.40.0", features = ["rt", "macros", "rt-multi-thread"] } tokio-stream = { version = "0.1.16", features = ["sync"] } uuid = { version = "1.10.0", features = ["v4"] } diff --git a/src/channel/app.rs b/src/channel/app.rs index adefa3e..c060b23 100644 --- a/src/channel/app.rs +++ b/src/channel/app.rs @@ -16,7 +16,7 @@ use super::repo::{ use crate::{ clock::DateTime, error::BoxedError, - login::repo::logins::{Id as LoginId, Login, Provider as _}, + login::repo::logins::{Login, Provider as _}, }; pub struct Channels<'a> { @@ -32,9 +32,9 @@ impl<'a> Channels<'a> { pub async fn create(&self, name: &str) -> Result<(), BoxedError> { let mut tx = self.db.begin().await?; let channel = tx.channels().create(name).await?; + self.broadcaster.register_channel(&channel); tx.commit().await?; - self.broadcaster.register_channel(&channel)?; Ok(()) } @@ -50,7 +50,7 @@ impl<'a> Channels<'a> { .messages() .create(&login.id, channel, body, sent_at) .await?; - let message = Message::from_login(login, message)?; + let message = Message::from_login(login, message); tx.commit().await?; self.broadcaster.broadcast(channel, message); @@ -122,33 +122,25 @@ impl Message { Ok(message) } - fn from_login(sender: &Login, message: StoredMessage) -> Result<Self, MessageError> { - if sender.id != message.sender { - // This functionally can't happen, but the funny thing about "This - // can never happen" comments is that they're usually wrong. - return Err(MessageError::LoginMismatched { - sender: sender.id.clone(), - message: message.sender, - }); - } + fn from_login(sender: &Login, message: StoredMessage) -> Self { + // Panic as this logic is enforced by the caller anyways. This "can't + // happen," other than via programming mistakes, and cannot be fixed + // by config changes or changing user behaviours. + assert_eq!( + message.sender, sender.id, + "broadcast message must have the same sender ({}) as the stored message ({})", + sender.id, message.sender, + ); - let message = Self { + Self { sender: sender.clone(), id: message.id, body: message.body, sent_at: message.sent_at, - }; - - Ok(message) + } } } -#[derive(Debug, thiserror::Error)] -enum MessageError { - #[error("sender login id {sender} did not match message login id {message}")] - LoginMismatched { sender: LoginId, message: LoginId }, -} - // Clones will share the same senders collection. #[derive(Clone)] pub struct Broadcaster { @@ -181,16 +173,15 @@ impl Broadcaster { } } - pub fn register_channel(&self, channel: &ChannelId) -> Result<(), RegisterError> { + // panic: if ``channel`` is already registered. + pub fn register_channel(&self, channel: &ChannelId) { match self.senders().entry(channel.clone()) { // This ever happening indicates a serious logic error. - Entry::Occupied(_) => return Err(RegisterError::Duplicate(channel.clone())), + Entry::Occupied(_) => panic!("duplicate channel registration for channel {channel}"), Entry::Vacant(entry) => { entry.insert(Self::make_sender()); } } - - Ok(()) } // panic: if ``channel`` has not been previously registered, and was not @@ -230,9 +221,3 @@ impl Broadcaster { tx } } - -#[derive(Debug, thiserror::Error)] -pub enum RegisterError { - #[error("duplicate broadcast registration for channel {0}")] - Duplicate(ChannelId), -} |
