]> Untitled Git - lemmy.git/blobdiff - crates/db_schema/src/impls/local_site.rs
Use enum for registration mode setting (#2604)
[lemmy.git] / crates / db_schema / src / impls / local_site.rs
index b9e920d15aa140d5095161f0e47e4b18da75e364..dd3d06d626fb37b06f4bceb6697c1cacd55f7f3c 100644 (file)
@@ -1,10 +1,25 @@
 use crate::{
   schema::local_site::dsl::local_site,
-  source::local_site::{LocalSite, LocalSiteInsertForm, LocalSiteUpdateForm},
+  source::local_site::{
+    LocalSite,
+    LocalSiteInsertForm,
+    LocalSiteUpdateForm,
+    RegistrationMode,
+    RegistrationModeType,
+  },
   utils::{get_conn, DbPool},
 };
-use diesel::{dsl::insert_into, result::Error};
+use diesel::{
+  deserialize,
+  deserialize::FromSql,
+  dsl::insert_into,
+  pg::{Pg, PgValue},
+  result::Error,
+  serialize,
+  serialize::{IsNull, Output, ToSql},
+};
 use diesel_async::RunQueryDsl;
+use std::io::Write;
 
 impl LocalSite {
   pub async fn create(pool: &DbPool, form: &LocalSiteInsertForm) -> Result<Self, Error> {
@@ -30,3 +45,25 @@ impl LocalSite {
     diesel::delete(local_site).execute(conn).await
   }
 }
+
+impl ToSql<RegistrationModeType, Pg> for RegistrationMode {
+  fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, Pg>) -> serialize::Result {
+    match *self {
+      RegistrationMode::Closed => out.write_all(b"closed")?,
+      RegistrationMode::RequireApplication => out.write_all(b"require_application")?,
+      RegistrationMode::Open => out.write_all(b"open")?,
+    }
+    Ok(IsNull::No)
+  }
+}
+
+impl FromSql<RegistrationModeType, Pg> for RegistrationMode {
+  fn from_sql(bytes: PgValue<'_>) -> deserialize::Result<Self> {
+    match bytes.as_bytes() {
+      b"closed" => Ok(RegistrationMode::Closed),
+      b"require_application" => Ok(RegistrationMode::RequireApplication),
+      b"open" => Ok(RegistrationMode::Open),
+      _ => Err("Unrecognized enum variant".into()),
+    }
+  }
+}