瀏覽代碼

Make search API selection logic cleaner

Santiago Pastorino 3 年之前
父節點
當前提交
a12b1470e0
共有 1 個文件被更改,包括 23 次插入12 次删除
  1. 23 12
      src/github.rs

+ 23 - 12
src/github.rs

@@ -773,31 +773,42 @@ impl Repository {
             ..
         } = query;
 
-        let use_issues = exclude_labels.is_empty() && filters.iter().all(|&(key, _)| key != "no");
+        // `is: pull-request` indicates the query to retrieve PRs only
         let is_pr = filters
             .iter()
             .any(|&(key, value)| key == "is" && value == "pull-request");
-        // negating filters can only be handled by the search api
-        let url = if is_pr {
+
+        // There are some cases that can only be handled by the search API:
+        // 1. When using negating label filters (exclude_labels)
+        // 2. When there's a key parameter key=no
+        // 3. When the query is to retrieve PRs only and there are label filters
+        //
+        // Check https://docs.github.com/en/rest/reference/search#search-issues-and-pull-requests
+        // for more information
+        let use_search_api = !exclude_labels.is_empty()
+            || filters.iter().any(|&(key, _)| key == "no")
+            || is_pr && !include_labels.is_empty();
+
+        let url = if use_search_api {
+            self.build_search_issues_url(filters, include_labels, exclude_labels)
+        } else if is_pr {
             self.build_pulls_url(filters, include_labels)
-        } else if use_issues {
-            self.build_issues_url(filters, include_labels)
         } else {
-            self.build_search_issues_url(filters, include_labels, exclude_labels)
+            self.build_issues_url(filters, include_labels)
         };
 
         let result = client.get(&url);
-        if use_issues {
-            client
-                .json(result)
-                .await
-                .with_context(|| format!("failed to list issues from {}", url))
-        } else {
+        if use_search_api {
             let result = client
                 .json::<IssueSearchResult>(result)
                 .await
                 .with_context(|| format!("failed to list issues from {}", url))?;
             Ok(result.items)
+        } else {
+            client
+                .json(result)
+                .await
+                .with_context(|| format!("failed to list issues from {}", url))
         }
     }