summaryrefslogtreecommitdiff
path: root/src/services/id.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/id.rs')
-rw-r--r--src/services/id.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/services/id.rs b/src/services/id.rs
index 7970c60..0c665ed 100644
--- a/src/services/id.rs
+++ b/src/services/id.rs
@@ -1,16 +1,24 @@
+use std::future::Future;
+
use exun::RawUnexpected;
use sqlx::{Executor, MySql};
use uuid::Uuid;
-use super::db;
-
-/// Create a unique user id, handling duplicate ID's
-pub async fn new_user_id<'c>(
- conn: impl Executor<'c, Database = MySql> + Clone,
+/// Create a unique id, handling duplicate ID's.
+///
+/// The given `unique_check` parameter returns `true` if the ID is used and
+/// `false` otherwise.
+pub async fn new_id<
+ 'c,
+ E: Executor<'c, Database = MySql> + Clone,
+ F: Future<Output = Result<bool, RawUnexpected>>,
+>(
+ conn: E,
+ unique_check: impl Fn(E, Uuid) -> F,
) -> Result<Uuid, RawUnexpected> {
let uuid = loop {
let uuid = Uuid::new_v4();
- if !db::user_id_exists(conn.clone(), uuid).await? {
+ if !unique_check(conn.clone(), uuid).await? {
break uuid;
}
};