@@ -34,9 +34,6 @@ use anyhow::{bail, Context};
3434use chrono:: { DateTime , Utc } ;
3535use futures_util:: stream:: Stream ;
3636use futures_util:: StreamExt ;
37- use serde:: de:: Error as _;
38- use std:: borrow:: Cow ;
39- use std:: mem;
4037use std:: path:: PathBuf ;
4138use std:: pin:: Pin ;
4239use std:: sync:: Arc ;
@@ -227,89 +224,6 @@ async fn render_sql(
227224 resp_recv. await . map_err ( ErrorInternalServerError )
228225}
229226
230- #[ derive( Debug , serde:: Serialize , PartialEq , Clone ) ]
231- #[ serde( untagged) ]
232- pub enum SingleOrVec {
233- Single ( String ) ,
234- Vec ( Vec < String > ) ,
235- }
236-
237- impl < ' de > serde:: Deserialize < ' de > for SingleOrVec {
238- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
239- where
240- D : serde:: Deserializer < ' de > ,
241- {
242- let value = serde_json:: Value :: deserialize ( deserializer) ?;
243- match value {
244- serde_json:: Value :: String ( s) => Ok ( SingleOrVec :: Single ( s) ) ,
245- serde_json:: Value :: Array ( values) => {
246- let mut strings = Vec :: with_capacity ( values. len ( ) ) ;
247- for ( idx, item) in values. into_iter ( ) . enumerate ( ) {
248- match item {
249- serde_json:: Value :: String ( s) => strings. push ( s) ,
250- other => {
251- return Err ( D :: Error :: custom ( format ! (
252- "expected an array of strings, but item at index {idx} is {other}"
253- ) ) )
254- }
255- }
256- }
257- Ok ( SingleOrVec :: Vec ( strings) )
258- }
259- other => Err ( D :: Error :: custom ( format ! (
260- "expected a string or an array of strings, but found {other}"
261- ) ) ) ,
262- }
263- }
264- }
265-
266- impl std:: fmt:: Display for SingleOrVec {
267- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
268- match self {
269- SingleOrVec :: Single ( x) => write ! ( f, "{x}" ) ,
270- SingleOrVec :: Vec ( v) => {
271- write ! ( f, "[" ) ?;
272- let mut it = v. iter ( ) ;
273- if let Some ( first) = it. next ( ) {
274- write ! ( f, "{first}" ) ?;
275- }
276- for item in it {
277- write ! ( f, ", {item}" ) ?;
278- }
279- write ! ( f, "]" )
280- }
281- }
282- }
283- }
284-
285- impl SingleOrVec {
286- pub ( crate ) fn merge ( & mut self , other : Self ) {
287- match ( self , other) {
288- ( Self :: Single ( old) , Self :: Single ( new) ) => * old = new,
289- ( old, mut new) => {
290- let mut v = old. take_vec ( ) ;
291- v. extend_from_slice ( & new. take_vec ( ) ) ;
292- * old = Self :: Vec ( v) ;
293- }
294- }
295- }
296-
297- fn take_vec ( & mut self ) -> Vec < String > {
298- match self {
299- SingleOrVec :: Single ( x) => vec ! [ mem:: take( x) ] ,
300- SingleOrVec :: Vec ( v) => mem:: take ( v) ,
301- }
302- }
303-
304- #[ must_use]
305- pub fn as_json_str ( & self ) -> Cow < ' _ , str > {
306- match self {
307- SingleOrVec :: Single ( x) => Cow :: Borrowed ( x) ,
308- SingleOrVec :: Vec ( v) => Cow :: Owned ( serde_json:: to_string ( v) . unwrap ( ) ) ,
309- }
310- }
311- }
312-
313227async fn process_sql_request (
314228 req : & mut ServiceRequest ,
315229 sql_path : PathBuf ,
0 commit comments