summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--src/channel/app.rs49
3 files changed, 17 insertions, 34 deletions
diff --git a/Cargo.lock b/Cargo.lock
index f48e75d..ebcaee1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -749,7 +749,6 @@ dependencies = [
"serde",
"serde_json",
"sqlx",
- "thiserror",
"tokio",
"tokio-stream",
"uuid",
diff --git a/Cargo.toml b/Cargo.toml
index e69de87..fd74836 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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),
-}