]> Untitled Git - lemmy.git/commitdiff
Introduce the "MaybeOptional" trait.
authorLyra <teromene@teromene.fr>
Tue, 10 Dec 2019 23:10:39 +0000 (00:10 +0100)
committerLyra <teromene@teromene.fr>
Tue, 10 Dec 2019 23:10:39 +0000 (00:10 +0100)
This trait is a generic type that allows us to get an Option from any type and from another option. It can be used to remove the ugly "do_something", "do_something_optional" that we previously had.

server/src/api/community.rs
server/src/api/post.rs
server/src/api/site.rs
server/src/api/user.rs
server/src/db/comment_view.rs
server/src/db/community_view.rs
server/src/db/mod.rs
server/src/db/post_view.rs
server/src/db/user_mention_view.rs
server/src/db/user_view.rs

index 9492d75d377072dbc1ad08331a3224be245eb3ca..5c97f0886e11a0b47d2f5b9369bdf47f5e662df3 100644 (file)
@@ -351,10 +351,10 @@ impl Perform<ListCommunitiesResponse> for Oper<ListCommunities> {
 
     let communities = CommunityQueryBuilder::create(&conn)
       .sort(&sort)
-      .from_user_id_optional(user_id)
+      .from_user_id(user_id)
       .show_nsfw(show_nsfw)
-      .page_optional(data.page)
-      .limit_optional(data.limit)
+      .page(data.page)
+      .limit(data.limit)
       .list()?;
 
     // Return the jwt
index 4855865b00d627efe4fde84879ca3ba39b03da83..0b54840f4ef2958429d33530f2e23acdc8cb3a98 100644 (file)
@@ -180,7 +180,7 @@ impl Perform<GetPostResponse> for Oper<GetPost> {
 
     let comments = CommentQueryBuilder::create(&conn)
       .for_post_id(data.id)
-      .my_user_id_optional(user_id)
+      .my_user_id(user_id)
       .limit(9999)
       .list()?;
 
@@ -236,10 +236,10 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> {
       .listing_type(type_)
       .sort(&sort)
       .show_nsfw(show_nsfw)
-      .for_community_id_optional(data.community_id)
-      .my_user_id_optional(user_id)
-      .page_optional(data.page)
-      .limit_optional(data.limit)
+      .for_community_id(data.community_id)
+      .my_user_id(user_id)
+      .page(data.page)
+      .limit(data.limit)
       .list()
     {
       Ok(posts) => posts,
index 26111467679048c1fa5b473a354f4883226a0119..cb6edfd587a067169494e0cff74ef886799b0db9 100644 (file)
@@ -322,75 +322,75 @@ impl Perform<SearchResponse> for Oper<Search> {
         posts = PostQueryBuilder::create(&conn)
           .sort(&sort)
           .show_nsfw(true)
-          .for_community_id_optional(data.community_id)
+          .for_community_id(data.community_id)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
       SearchType::Comments => {
         comments = CommentQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
       SearchType::Communities => {
         communities = CommunityQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
       SearchType::Users => {
         users = UserQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
       SearchType::All => {
         posts = PostQueryBuilder::create(&conn)
           .sort(&sort)
           .show_nsfw(true)
-          .for_community_id_optional(data.community_id)
+          .for_community_id(data.community_id)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
 
         comments = CommentQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
 
         communities = CommunityQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
 
         users = UserQueryBuilder::create(&conn)
           .sort(&sort)
           .search_term(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
       SearchType::Url => {
         posts = PostQueryBuilder::create(&conn)
           .sort(&sort)
           .show_nsfw(true)
-          .for_community_id_optional(data.community_id)
+          .for_community_id(data.community_id)
           .url_search(data.q.to_owned())
-          .page_optional(data.page)
-          .limit_optional(data.limit)
+          .page(data.page)
+          .limit(data.limit)
           .list()?;
       }
     };
index ebbe48a2fe15f10a54e4bb6d199412bdfa1d4693..3047a0d3f17cf9d26d383b74d170490fff7b0826 100644 (file)
@@ -373,17 +373,17 @@ impl Perform<GetUserDetailsResponse> for Oper<GetUserDetails> {
       .sort(&sort)
       .show_nsfw(show_nsfw)
       .saved_only(data.saved_only)
-      .for_community_id_optional(data.community_id)
-      .my_user_id_optional(user_id)
-      .page_optional(data.page)
-      .limit_optional(data.limit);
+      .for_community_id(data.community_id)
+      .my_user_id(user_id)
+      .page(data.page)
+      .limit(data.limit);
 
     let mut comments_query = CommentQueryBuilder::create(&conn)
       .sort(&sort)
       .saved_only(data.saved_only)
-      .my_user_id_optional(user_id)
-      .page_optional(data.page)
-      .limit_optional(data.limit);
+      .my_user_id(user_id)
+      .page(data.page)
+      .limit(data.limit);
 
     // If its saved only, you don't care what creator it was
     // Or, if its not saved, then you only want it for that specific creator
@@ -561,8 +561,8 @@ impl Perform<GetRepliesResponse> for Oper<GetReplies> {
     let replies = ReplyQueryBuilder::create(&conn, user_id)
       .sort(&sort)
       .unread_only(data.unread_only)
-      .page_optional(data.page)
-      .limit_optional(data.limit)
+      .page(data.page)
+      .limit(data.limit)
       .list()?;
 
     Ok(GetRepliesResponse {
@@ -589,8 +589,8 @@ impl Perform<GetUserMentionsResponse> for Oper<GetUserMentions> {
     let mentions = UserMentionQueryBuilder::create(&conn, user_id)
       .sort(&sort)
       .unread_only(data.unread_only)
-      .page_optional(data.page)
-      .limit_optional(data.limit)
+      .page(data.page)
+      .limit(data.limit)
       .list()?;
 
     Ok(GetUserMentionsResponse {
index f9c00b2098b9178d45d32cdd66ec9e7b9f2fbbef..5c321e2e2776c661240ba4d9ffaca8a3f00242ba 100644 (file)
@@ -92,43 +92,23 @@ impl<'a> CommentQueryBuilder<'a> {
     self
   }
 
-  pub fn for_post_id(mut self, for_post_id: i32) -> Self {
-    self.for_post_id = Some(for_post_id);
+  pub fn for_post_id<T: MaybeOptional<i32>>(mut self, for_post_id: T) -> Self {
+    self.for_post_id = for_post_id.get_optional();
     self
   }
 
-  pub fn for_post_id_optional(mut self, for_post_id: Option<i32>) -> Self {
-    self.for_post_id = for_post_id;
+  pub fn for_creator_id<T: MaybeOptional<i32>>(mut self, for_creator_id: T) -> Self {
+    self.for_creator_id = for_creator_id.get_optional();
     self
   }
 
-  pub fn for_creator_id(mut self, for_creator_id: i32) -> Self {
-    self.for_creator_id = Some(for_creator_id);
+  pub fn search_term<T: MaybeOptional<String>>(mut self, search_term: T) -> Self {
+    self.search_term = search_term.get_optional();
     self
   }
 
-  pub fn for_creator_id_optional(mut self, for_creator_id: Option<i32>) -> Self {
-    self.for_creator_id = for_creator_id;
-    self
-  }
-
-  pub fn search_term(mut self, search_term: String) -> Self {
-    self.search_term = Some(search_term);
-    self
-  }
-
-  pub fn search_term_optional(mut self, search_term: Option<String>) -> Self {
-    self.search_term = search_term;
-    self
-  }
-
-  pub fn my_user_id(mut self, my_user_id: i32) -> Self {
-    self.my_user_id = Some(my_user_id);
-    self
-  }
-
-  pub fn my_user_id_optional(mut self, my_user_id: Option<i32>) -> Self {
-    self.my_user_id = my_user_id;
+  pub fn my_user_id<T: MaybeOptional<i32>>(mut self, my_user_id: T) -> Self {
+    self.my_user_id = my_user_id.get_optional();
     self
   }
 
@@ -137,23 +117,13 @@ impl<'a> CommentQueryBuilder<'a> {
     self
   }
 
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
-    self
-  }
-
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
-    self
-  }
-
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }
 
@@ -331,23 +301,13 @@ impl<'a> ReplyQueryBuilder<'a> {
     self
   }
 
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
-    self
-  }
-
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
-    self
-  }
-
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }
 
index c90beaba5ada0b3ea68ee94062a113c6a933568d..04b68441aa2a4da4dff018c485dbc7fe5b9bb527 100644 (file)
@@ -135,50 +135,28 @@ impl<'a> CommunityQueryBuilder<'a> {
     self
   }
 
-  pub fn from_user_id(mut self, from_user_id: i32) -> Self {
-    self.from_user_id = Some(from_user_id);
+  pub fn from_user_id<T: MaybeOptional<i32>>(mut self, from_user_id: T) -> Self {
+    self.from_user_id = from_user_id.get_optional();
     self
   }
 
-  pub fn from_user_id_optional(self, from_user_id: Option<i32>) -> Self {
-    match from_user_id {
-      Some(from_user_id) => self.from_user_id(from_user_id),
-      None => self,
-    }
-  }
-
   pub fn show_nsfw(mut self, show_nsfw: bool) -> Self {
     self.show_nsfw = show_nsfw;
     self
   }
 
-  pub fn search_term(mut self, search_term: String) -> Self {
-    self.search_term = Some(search_term);
-    self
-  }
-
-  pub fn search_term_optional(mut self, search_term: Option<String>) -> Self {
-    self.search_term = search_term;
-    self
-  }
-
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
-    self
-  }
-
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
+  pub fn search_term<T: MaybeOptional<String>>(mut self, search_term: T) -> Self {
+    self.search_term = search_term.get_optional();
     self
   }
 
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }
 
index 09640e22cce5cdec6644c3b2d8b22d6ac7174088..3501fcda6cffdd6d2dc05b0389aecff0e7ba5eb7 100644 (file)
@@ -91,6 +91,22 @@ pub trait Readable<T> {
     Self: Sized;
 }
 
+pub trait MaybeOptional<T> {
+  fn get_optional(self) -> Option<T>;
+}
+
+impl<T> MaybeOptional<T> for T {
+  fn get_optional(self) -> Option<T> {
+    return Some(self);
+  }
+}
+
+impl<T> MaybeOptional<T> for Option<T> {
+  fn get_optional(self) -> Option<T> {
+    return self;
+  }
+}
+
 pub fn establish_connection() -> PgConnection {
   let db_url = Settings::get().db_url;
   PgConnection::establish(&db_url).expect(&format!("Error connecting to {}", db_url))
index 4fcd8e47e939d4c9e331ae054aba90a13bd6680f..615b9b0db993d133e236b1eab283f1d15e344bd8 100644 (file)
@@ -120,65 +120,40 @@ impl<'a> PostQueryBuilder<'a> {
     self
   }
 
-  pub fn for_community_id(mut self, for_community_id: i32) -> Self {
+  pub fn for_community_id<T: MaybeOptional<i32>>(mut self, for_community_id: T) -> Self {
     use super::post_view::post_view::dsl::*;
-    self.query = self.query.filter(community_id.eq(for_community_id));
-    self.query = self.query.then_order_by(stickied.desc());
-    self
-  }
-
-  pub fn for_community_id_optional(self, for_community_id: Option<i32>) -> Self {
-    match for_community_id {
-      Some(for_community_id) => self.for_community_id(for_community_id),
-      None => self,
+    if let Some(for_community_id) = for_community_id.get_optional() {
+      self.query = self.query.filter(community_id.eq(for_community_id));
+      self.query = self.query.then_order_by(stickied.desc());
     }
-  }
-
-  pub fn for_creator_id(mut self, for_creator_id: i32) -> Self {
-    self.for_creator_id = Some(for_creator_id);
     self
   }
 
-  pub fn for_creator_id_optional(self, for_creator_id: Option<i32>) -> Self {
-    match for_creator_id {
-      Some(for_creator_id) => self.for_creator_id(for_creator_id),
-      None => self,
+  pub fn for_creator_id<T: MaybeOptional<i32>>(mut self, for_creator_id: T) -> Self {
+    if let Some(for_creator_id) = for_creator_id.get_optional() {
+      self.for_creator_id = Some(for_creator_id);
     }
-  }
-
-  pub fn search_term(mut self, search_term: String) -> Self {
-    use super::post_view::post_view::dsl::*;
-    self.query = self.query.filter(name.ilike(fuzzy_search(&search_term)));
     self
   }
 
-  pub fn search_term_optional(self, search_term: Option<String>) -> Self {
-    match search_term {
-      Some(search_term) => self.search_term(search_term),
-      None => self,
-    }
-  }
-
-  pub fn url_search(mut self, url_search: String) -> Self {
+  pub fn search_term<T: MaybeOptional<String>>(mut self, search_term: T) -> Self {
     use super::post_view::post_view::dsl::*;
-    self.query = self.query.filter(url.eq(url_search));
+    if let Some(search_term) = search_term.get_optional() {
+      self.query = self.query.filter(name.ilike(fuzzy_search(&search_term)));
+    }
     self
   }
 
-  pub fn url_search_optional(self, url_search: Option<String>) -> Self {
-    match url_search {
-      Some(url_search) => self.url_search(url_search),
-      None => self,
+  pub fn url_search<T: MaybeOptional<String>>(mut self, url_search: T) -> Self {
+    use super::post_view::post_view::dsl::*;
+    if let Some(url_search) = url_search.get_optional() {
+      self.query = self.query.filter(url.eq(url_search));
     }
-  }
-
-  pub fn my_user_id(mut self, my_user_id: i32) -> Self {
-    self.my_user_id = Some(my_user_id);
     self
   }
 
-  pub fn my_user_id_optional(mut self, my_user_id: Option<i32>) -> Self {
-    self.my_user_id = my_user_id;
+  pub fn my_user_id<T: MaybeOptional<i32>>(mut self, my_user_id: T) -> Self {
+    self.my_user_id = my_user_id.get_optional();
     self
   }
 
@@ -197,23 +172,13 @@ impl<'a> PostQueryBuilder<'a> {
     self
   }
 
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
-    self
-  }
-
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
-    self
-  }
-
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }
 
index 19b803da8966c7755dba10f1862d16246226d9b7..45541861e7aea0fa6c97d3a0ca665655febf29f7 100644 (file)
@@ -96,23 +96,13 @@ impl<'a> UserMentionQueryBuilder<'a> {
     self
   }
 
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
-    self
-  }
-
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
-    self
-  }
-
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }
 
index 0637d647ee8342b8de48f760412913f1216fa4a6..0ed95eefd45e97671b88173867004aea20b3cd9d 100644 (file)
@@ -62,36 +62,21 @@ impl<'a> UserQueryBuilder<'a> {
     self
   }
 
-  pub fn search_term(mut self, search_term: String) -> Self {
+  pub fn search_term<T: MaybeOptional<String>>(mut self, search_term: T) -> Self {
     use super::user_view::user_view::dsl::*;
-    self.query = self.query.filter(name.ilike(fuzzy_search(&search_term)));
-    self
-  }
-
-  pub fn search_term_optional(self, search_term: Option<String>) -> Self {
-    match search_term {
-      Some(search_term) => self.search_term(search_term),
-      None => self,
+    if let Some(search_term) = search_term.get_optional() {
+      self.query = self.query.filter(name.ilike(fuzzy_search(&search_term)));
     }
-  }
-
-  pub fn page(mut self, page: i64) -> Self {
-    self.page = Some(page);
-    self
-  }
-
-  pub fn page_optional(mut self, page: Option<i64>) -> Self {
-    self.page = page;
     self
   }
 
-  pub fn limit(mut self, limit: i64) -> Self {
-    self.limit = Some(limit);
+  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
+    self.page = page.get_optional();
     self
   }
 
-  pub fn limit_optional(mut self, limit: Option<i64>) -> Self {
-    self.limit = limit;
+  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
+    self.limit = limit.get_optional();
     self
   }