@@ -43,6 +43,7 @@ impl PaginationOptions {
43
43
PaginationOptionsBuilder {
44
44
limit_page_numbers : false ,
45
45
enable_seek : false ,
46
+ enable_seek_backward : false ,
46
47
enable_pages : true ,
47
48
}
48
49
}
@@ -85,6 +86,7 @@ pub(crate) struct PaginationOptionsBuilder {
85
86
limit_page_numbers : bool ,
86
87
enable_pages : bool ,
87
88
enable_seek : bool ,
89
+ enable_seek_backward : bool ,
88
90
}
89
91
90
92
impl PaginationOptionsBuilder {
@@ -103,6 +105,12 @@ impl PaginationOptionsBuilder {
103
105
self
104
106
}
105
107
108
+ #[ allow( dead_code) ]
109
+ pub ( crate ) fn enable_seek_backward ( mut self , enable : bool ) -> Self {
110
+ self . enable_seek_backward = enable;
111
+ self
112
+ }
113
+
106
114
pub ( crate ) fn gather ( self , parts : & Parts ) -> AppResult < PaginationOptions > {
107
115
use axum:: extract:: Query ;
108
116
@@ -143,11 +151,19 @@ impl PaginationOptionsBuilder {
143
151
144
152
Page :: Numeric ( numeric_page)
145
153
} else if let Some ( s) = params. seek {
146
- if !self . enable_seek {
147
- return Err ( bad_request ( "?seek= is not supported for this request" ) ) ;
154
+ match s. starts_with ( '-' ) {
155
+ true if !self . enable_seek_backward => {
156
+ return Err ( bad_request (
157
+ "seek backward ?seek=- is not supported for this request" ,
158
+ ) ) ;
159
+ }
160
+ // TODO: add a varaint for seek backward
161
+ true => unimplemented ! ( "seek backward is not yet implemented" ) ,
162
+ false if !self . enable_seek => {
163
+ return Err ( bad_request ( "?seek= is not supported for this request" ) ) ;
164
+ }
165
+ false => Page :: Seek ( RawSeekPayload ( s) ) ,
148
166
}
149
-
150
- Page :: Seek ( RawSeekPayload ( s) )
151
167
} else {
152
168
Page :: Unspecified
153
169
} ;
0 commit comments