diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-09-15 23:50:41 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-09-16 11:03:22 -0400 |
| commit | 491cb3eb34d20140aed80dbb9edc39c4db5335d2 (patch) | |
| tree | e1e2e009f064dc6dfc8c98d2bf97d8d1f7b45615 /src/channel/repo/channels.rs | |
| parent | 99b33023332393e46f5a661901b980b78e6fb133 (diff) | |
Consolidate most repository types into a repo module.
Having them contained in the individual endpoint groups conveyed an unintended sense that their intended scope was _only_ that endpoint group. It also made most repo-related import paths _quite_ long. This splits up the repos as follows:
* "General applicability" repos - those that are only loosely connected to a single task, and are likely to be shared between tasks - go in crate::repo.
* Specialized repos - those tightly connected to a specific task - go in the module for that task, under crate::PATH::repo.
In both cases, each repo goes in its own submodule, to make it easier to use the module name as a namespace.
Which category a repo goes in is a judgment call. `crate::channel::repo::broadcast` (formerly `channel::repo::messages`) is used outside of `crate::channel`, for example, but its main purpose is to support channel message broadcasts. It could arguably live under `crate::event::repo::channel`, but the resulting namespace is less legible to me.
Diffstat (limited to 'src/channel/repo/channels.rs')
| -rw-r--r-- | src/channel/repo/channels.rs | 102 |
1 files changed, 0 insertions, 102 deletions
diff --git a/src/channel/repo/channels.rs b/src/channel/repo/channels.rs deleted file mode 100644 index ab7489c..0000000 --- a/src/channel/repo/channels.rs +++ /dev/null @@ -1,102 +0,0 @@ -use std::fmt; - -use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction}; - -use crate::id::Id as BaseId; - -pub trait Provider { - fn channels(&mut self) -> Channels; -} - -impl<'c> Provider for Transaction<'c, Sqlite> { - fn channels(&mut self) -> Channels { - Channels(self) - } -} - -pub struct Channels<'t>(&'t mut SqliteConnection); - -#[derive(Debug)] -pub struct Channel { - pub id: Id, - pub name: String, -} - -impl<'c> Channels<'c> { - /// Create a new channel. - pub async fn create(&mut self, name: &str) -> Result<Id, sqlx::Error> { - let id = Id::generate(); - - let channel = sqlx::query_scalar!( - r#" - insert - into channel (id, name) - values ($1, $2) - returning id as "id: Id" - "#, - id, - name, - ) - .fetch_one(&mut *self.0) - .await?; - - Ok(channel) - } - - pub async fn by_id(&mut self, channel: Id) -> Result<Channel, sqlx::Error> { - let channel = sqlx::query_as!( - Channel, - r#" - select id as "id: Id", name - from channel - where id = $1 - "#, - channel, - ) - .fetch_one(&mut *self.0) - .await?; - - Ok(channel) - } - - pub async fn all(&mut self) -> Result<Vec<Channel>, sqlx::Error> { - let channels = sqlx::query_as!( - Channel, - r#" - select - channel.id as "id: Id", - channel.name - from channel - order by channel.name - "#, - ) - .fetch_all(&mut *self.0) - .await?; - - Ok(channels) - } -} - -/// Stable identifier for a [Channel]. Prefixed with `C`. -#[derive(Clone, Debug, Eq, Hash, PartialEq, sqlx::Type, serde::Deserialize, serde::Serialize)] -#[sqlx(transparent)] -#[serde(transparent)] -pub struct Id(BaseId); - -impl From<BaseId> for Id { - fn from(id: BaseId) -> Self { - Self(id) - } -} - -impl Id { - pub fn generate() -> Self { - BaseId::generate("C") - } -} - -impl fmt::Display for Id { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} |
