3
3
// Copyright: 2024, Rémi Bardon <[email protected] >
4
4
// License: Mozilla Public License v2.0 (MPL v2.0)
5
5
6
+ use std:: {
7
+ fmt:: { Debug , Display } ,
8
+ ops:: Deref ,
9
+ str:: FromStr ,
10
+ } ;
11
+
6
12
use iso8601_duration:: Duration as ISODuration ;
7
- use sea_orm:: entity:: prelude:: * ;
8
- use sea_orm:: sea_query:: { self , ArrayType , ValueTypeErr } ;
9
- use sea_orm:: TryGetError ;
13
+ use sea_orm:: { entity:: prelude:: * , sea_query} ;
10
14
use serde:: { de, Deserialize , Deserializer , Serialize , Serializer } ;
11
15
12
- use std :: fmt :: { Debug , Display } ;
13
- use std :: ops :: Deref ;
14
- use std :: str:: FromStr ;
16
+ use crate :: sea_orm_try_get_by_string ;
17
+
18
+ const DURATION_INFINITE : & ' static str = "infinite" ;
15
19
16
20
#[ derive( Copy , Clone , Debug , PartialEq ) ]
17
21
pub struct Duration < Content : DurationContent > ( pub Content ) ;
@@ -103,35 +107,30 @@ impl<Content: DurationContent> TryFrom<ISODuration> for Duration<Content> {
103
107
impl < Content : DurationContent > sea_orm:: TryGetable for Duration < Content >
104
108
where
105
109
<Content as TryFrom < ISODuration > >:: Error : Debug ,
110
+ <Content as FromStr >:: Err : Debug ,
106
111
{
107
- fn try_get_by < I : sea_orm:: ColIdx > (
108
- res : & sea_orm:: QueryResult ,
109
- index : I ,
110
- ) -> Result < Self , TryGetError > {
111
- let value: String = res. try_get_by ( index) . map_err ( TryGetError :: DbErr ) ?;
112
- Self :: try_from ( value)
113
- // Technically, the value is not `null`, but we wouldn't want to unsafely unwrap here.
114
- . map_err ( |e| TryGetError :: Null ( format ! ( "{:?}" , e) ) )
115
- }
112
+ sea_orm_try_get_by_string ! ( ) ;
116
113
}
117
114
118
115
impl < Content : DurationContent > sea_query:: ValueType for Duration < Content >
119
116
where
120
117
Self : TryFrom < String > ,
121
118
{
122
- fn try_from ( v : Value ) -> Result < Self , ValueTypeErr > {
119
+ fn try_from ( v : Value ) -> Result < Self , sea_query :: ValueTypeErr > {
123
120
match v {
124
- Value :: String ( Some ( value) ) => ( * value) . try_into ( ) . map_err ( |_| ValueTypeErr ) ,
125
- _ => Err ( ValueTypeErr ) ,
121
+ Value :: String ( Some ( value) ) => {
122
+ Self :: from_str ( value. as_str ( ) ) . map_err ( |_| sea_query:: ValueTypeErr )
123
+ }
124
+ _ => Err ( sea_query:: ValueTypeErr ) ,
126
125
}
127
126
}
128
127
129
128
fn type_name ( ) -> String {
130
129
Content :: type_name ( )
131
130
}
132
131
133
- fn array_type ( ) -> ArrayType {
134
- ArrayType :: String
132
+ fn array_type ( ) -> sea_query :: ArrayType {
133
+ sea_query :: ArrayType :: String
135
134
}
136
135
137
136
fn column_type ( ) -> ColumnType {
@@ -207,12 +206,12 @@ impl TryFrom<ISODuration> for TimeLike {
207
206
}
208
207
impl DurationContent for TimeLike {
209
208
fn type_name ( ) -> String {
210
- stringify ! ( Time ) . to_owned ( )
209
+ " Time" . to_owned ( )
211
210
}
212
211
}
213
212
impl Display for TimeLike {
214
213
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
215
- write ! ( f , "{}" , self . into_iso_duration( ) )
214
+ Display :: fmt ( & self . into_iso_duration ( ) , f )
216
215
}
217
216
}
218
217
impl FromStr for TimeLike {
@@ -278,12 +277,12 @@ impl TryFrom<ISODuration> for DateLike {
278
277
}
279
278
impl DurationContent for DateLike {
280
279
fn type_name ( ) -> String {
281
- stringify ! ( Date ) . to_owned ( )
280
+ " Date" . to_owned ( )
282
281
}
283
282
}
284
283
impl Display for DateLike {
285
284
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
286
- write ! ( f , "{}" , self . into_iso_duration( ) )
285
+ Display :: fmt ( & self . into_iso_duration ( ) , f )
287
286
}
288
287
}
289
288
impl FromStr for DateLike {
@@ -310,22 +309,13 @@ impl<D> PossiblyInfinite<D> {
310
309
}
311
310
}
312
311
313
- impl < D > Into < Option < D > > for PossiblyInfinite < D > {
314
- fn into ( self ) -> Option < D > {
315
- match self {
316
- Self :: Infinite => None ,
317
- Self :: Finite ( d) => Some ( d) ,
318
- }
319
- }
320
- }
321
-
322
312
impl < D : Eq > Eq for PossiblyInfinite < D > { }
323
313
324
314
impl < D : Display > Display for PossiblyInfinite < D > {
325
315
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
326
316
match self {
327
- Self :: Infinite => write ! ( f, "infinite " ) ,
328
- Self :: Finite ( d) => write ! ( f , "{d}" ) ,
317
+ Self :: Infinite => write ! ( f, "{DURATION_INFINITE} " ) ,
318
+ Self :: Finite ( d) => Display :: fmt ( d , f ) ,
329
319
}
330
320
}
331
321
}
@@ -335,17 +325,14 @@ impl<D: FromStr> FromStr for PossiblyInfinite<D> {
335
325
336
326
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
337
327
match s {
338
- "infinite" => Ok ( Self :: Infinite ) ,
328
+ DURATION_INFINITE => Ok ( Self :: Infinite ) ,
339
329
d => D :: from_str ( d) . map ( Self :: Finite ) ,
340
330
}
341
331
}
342
332
}
343
333
344
334
impl < D : Display > Serialize for PossiblyInfinite < D > {
345
- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
346
- where
347
- S : Serializer ,
348
- {
335
+ fn serialize < S : Serializer > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error > {
349
336
self . to_string ( ) . serialize ( serializer)
350
337
}
351
338
}
@@ -363,14 +350,13 @@ where
363
350
}
364
351
}
365
352
366
- impl < D > From < PossiblyInfinite < D > > for sea_query:: Value
367
- where
368
- sea_query:: Value : From < D > ,
369
- {
353
+ impl < D : Into < sea_query:: Value > > From < PossiblyInfinite < D > > for sea_query:: Value {
370
354
fn from ( value : PossiblyInfinite < D > ) -> Self {
371
355
match value {
372
- PossiblyInfinite :: Infinite => Self :: String ( Some ( Box :: new ( "infinite" . to_string ( ) ) ) ) ,
373
- PossiblyInfinite :: Finite ( duration) => Self :: from ( duration) ,
356
+ PossiblyInfinite :: Infinite => {
357
+ Self :: String ( Some ( Box :: new ( DURATION_INFINITE . to_string ( ) ) ) )
358
+ }
359
+ PossiblyInfinite :: Finite ( duration) => duration. into ( ) ,
374
360
}
375
361
}
376
362
}
@@ -379,35 +365,38 @@ impl<D: sea_orm::TryGetable> sea_orm::TryGetable for PossiblyInfinite<D> {
379
365
fn try_get_by < I : sea_orm:: ColIdx > (
380
366
res : & sea_orm:: QueryResult ,
381
367
index : I ,
382
- ) -> Result < Self , TryGetError > {
368
+ ) -> Result < Self , sea_orm:: TryGetError > {
369
+ // https://github.com/SeaQL/sea-orm/discussions/1176#discussioncomment-4024088
383
370
let value = res
384
371
. try_get_by ( index)
385
- . map_err ( TryGetError :: DbErr )
386
- . and_then ( |opt : Option < String > | opt. ok_or ( TryGetError :: Null ( format ! ( "{index:?}" ) ) ) ) ?;
372
+ . map_err ( sea_orm:: TryGetError :: DbErr )
373
+ . and_then ( |opt : Option < String > | {
374
+ opt. ok_or ( sea_orm:: TryGetError :: Null ( format ! ( "{index:?}" ) ) )
375
+ } ) ?;
387
376
match value. as_str ( ) {
388
- "infinite" => Ok ( Self :: Infinite ) ,
377
+ DURATION_INFINITE => Ok ( Self :: Infinite ) ,
389
378
_ => D :: try_get_by ( res, index) . map ( Self :: Finite ) ,
390
379
}
391
380
}
392
381
}
393
382
394
383
impl < D : sea_query:: ValueType > sea_query:: ValueType for PossiblyInfinite < D > {
395
- fn try_from ( v : Value ) -> Result < Self , ValueTypeErr > {
384
+ fn try_from ( v : Value ) -> Result < Self , sea_query :: ValueTypeErr > {
396
385
let value: Option < String > = v. unwrap ( ) ;
397
386
let Some ( value) = value else {
398
- return Err ( ValueTypeErr ) ;
387
+ return Err ( sea_query :: ValueTypeErr ) ;
399
388
} ;
400
389
match value. as_str ( ) {
401
- "infinite" => Ok ( Self :: Infinite ) ,
390
+ DURATION_INFINITE => Ok ( Self :: Infinite ) ,
402
391
_ => D :: try_from ( Value :: String ( Some ( Box :: new ( value) ) ) ) . map ( Self :: Finite ) ,
403
392
}
404
393
}
405
394
406
395
fn type_name ( ) -> String {
407
- format ! ( "{} <{}>" , stringify! ( PossiblyInfinite ) , D :: type_name( ) )
396
+ format ! ( "PossiblyInfinite <{}>" , D :: type_name( ) )
408
397
}
409
398
410
- fn array_type ( ) -> ArrayType {
399
+ fn array_type ( ) -> sea_query :: ArrayType {
411
400
D :: array_type ( )
412
401
}
413
402
0 commit comments