@@ -43,6 +43,18 @@ pub struct ListQueryParams {
43
43
sort : Option < String > ,
44
44
}
45
45
46
+ impl ListQueryParams {
47
+ fn include ( & self ) -> AppResult < ShowIncludeMode > {
48
+ let include = self
49
+ . include
50
+ . as_ref ( )
51
+ . map ( |mode| ShowIncludeMode :: from_str ( mode) )
52
+ . transpose ( ) ?
53
+ . unwrap_or_default ( ) ;
54
+ Ok ( include)
55
+ }
56
+ }
57
+
46
58
/// List all versions of a crate.
47
59
#[ utoipa:: path(
48
60
get,
@@ -73,18 +85,12 @@ pub async fn list_versions(
73
85
None => None ,
74
86
} ;
75
87
76
- let include = params
77
- . include
78
- . map ( |mode| ShowIncludeMode :: from_str ( & mode) )
79
- . transpose ( ) ?
80
- . unwrap_or_default ( ) ;
81
-
82
88
// Sort by semver by default
83
- let versions_and_publishers = match params. sort . map ( |s| s. to_lowercase ( ) ) . as_deref ( ) {
89
+ let versions_and_publishers = match & params. sort . as_ref ( ) . map ( |s| s. to_lowercase ( ) ) . as_deref ( ) {
84
90
Some ( "date" ) => {
85
- list_by_date ( crate_id, pagination. as_ref ( ) , include , & req, & mut conn) . await ?
91
+ list_by_date ( crate_id, pagination. as_ref ( ) , & params , & req, & mut conn) . await ?
86
92
}
87
- _ => list_by_semver ( crate_id, pagination. as_ref ( ) , include , & req, & mut conn) . await ?,
93
+ _ => list_by_semver ( crate_id, pagination. as_ref ( ) , & params , & req, & mut conn) . await ?,
88
94
} ;
89
95
90
96
let versions = versions_and_publishers
@@ -111,7 +117,7 @@ pub async fn list_versions(
111
117
async fn list_by_date (
112
118
crate_id : i32 ,
113
119
options : Option < & PaginationOptions > ,
114
- include : ShowIncludeMode ,
120
+ params : & ListQueryParams ,
115
121
req : & Parts ,
116
122
conn : & mut AsyncPgConnection ,
117
123
) -> AppResult < PaginatedVersionsAndPublishers > {
@@ -148,7 +154,7 @@ async fn list_by_date(
148
154
. map ( |p| req. query_with_params ( p) ) ;
149
155
} ;
150
156
151
- let release_tracks = if include. release_tracks {
157
+ let release_tracks = if params . include ( ) ? . release_tracks {
152
158
let mut sorted_versions = IndexSet :: new ( ) ;
153
159
if options. is_some ( ) {
154
160
versions:: table
@@ -216,12 +222,13 @@ async fn list_by_date(
216
222
async fn list_by_semver (
217
223
crate_id : i32 ,
218
224
options : Option < & PaginationOptions > ,
219
- include : ShowIncludeMode ,
225
+ params : & ListQueryParams ,
220
226
req : & Parts ,
221
227
conn : & mut AsyncPgConnection ,
222
228
) -> AppResult < PaginatedVersionsAndPublishers > {
223
229
use seek:: * ;
224
230
231
+ let include = params. include ( ) ?;
225
232
let ( data, total, release_tracks) = if let Some ( options) = options {
226
233
// Since versions will only increase in the future and both sorting and pagination need to
227
234
// happen on the app server, implementing it with fetching only the data needed for sorting
0 commit comments