99
99
}
100
100
}
101
101
102
+ #[ crate :: graphql_scalar_internal( description = "NaiveTime" ) ]
103
+ impl < S > GraphQLScalar for NaiveTime
104
+ where
105
+ S : ScalarValue ,
106
+ {
107
+ fn resolve ( & self ) -> Value {
108
+ Value :: scalar ( self . format ( "%H:%M:%S" ) . to_string ( ) )
109
+ }
110
+
111
+ fn from_input_value ( v : & InputValue ) -> Option < NaiveTime > {
112
+ v. as_string_value ( )
113
+ . and_then ( |s| NaiveTime :: parse_from_str ( s, "%H:%M:%S" ) . ok ( ) )
114
+ }
115
+
116
+ fn from_str < ' a > ( value : ScalarToken < ' a > ) -> ParseScalarResult < ' a , S > {
117
+ if let ScalarToken :: String ( value) = value {
118
+ Ok ( S :: from ( value. to_owned ( ) ) )
119
+ } else {
120
+ Err ( ParseError :: UnexpectedToken ( Token :: Scalar ( value) ) )
121
+ }
122
+ }
123
+ }
124
+
102
125
// JSON numbers (i.e. IEEE doubles) are not precise enough for nanosecond
103
126
// datetimes. Values will be truncated to microsecond resolution.
104
127
#[ crate :: graphql_scalar_internal( description = "NaiveDateTime" ) ]
@@ -194,6 +217,19 @@ mod test {
194
217
assert_eq ! ( parsed. day( ) , d) ;
195
218
}
196
219
220
+ #[ test]
221
+ fn naivetime_from_input_value ( ) {
222
+ let input: crate :: InputValue < DefaultScalarValue > ;
223
+ input = InputValue :: scalar ( "21:12:19" . to_string ( ) ) ;
224
+ let [ h, m, s] = [ 21 , 12 , 19 ] ;
225
+ let parsed: NaiveTime = crate :: FromInputValue :: from_input_value ( & input) . unwrap ( ) ;
226
+ let expected = NaiveTime :: from_hms ( h, m, s) ;
227
+ assert_eq ! ( parsed, expected) ;
228
+ assert_eq ! ( parsed. hour( ) , h) ;
229
+ assert_eq ! ( parsed. minute( ) , m) ;
230
+ assert_eq ! ( parsed. second( ) , s) ;
231
+ }
232
+
197
233
#[ test]
198
234
fn naivedatetime_from_input_value ( ) {
199
235
let raw = 1_000_000_000_f64 ;
@@ -230,6 +266,9 @@ mod integration_test {
230
266
fn exampleNaiveDateTime ( ) -> NaiveDateTime {
231
267
NaiveDate :: from_ymd ( 2016 , 7 , 8 ) . and_hms ( 9 , 10 , 11 )
232
268
}
269
+ fn exampleNaiveTime ( ) -> NaiveTime {
270
+ NaiveTime :: from_hms ( 16 , 7 , 8 )
271
+ }
233
272
fn exampleDateTimeFixedOffset ( ) -> DateTime < FixedOffset > {
234
273
DateTime :: parse_from_rfc3339 ( "1996-12-19T16:39:57-08:00" ) . unwrap ( )
235
274
}
@@ -242,6 +281,7 @@ mod integration_test {
242
281
{
243
282
exampleNaiveDate,
244
283
exampleNaiveDateTime,
284
+ exampleNaiveTime,
245
285
exampleDateTimeFixedOffset,
246
286
exampleDateTimeUtc,
247
287
}
@@ -265,6 +305,7 @@ mod integration_test {
265
305
vec![
266
306
( "exampleNaiveDate" , Value :: scalar( "2015-03-14" ) ) ,
267
307
( "exampleNaiveDateTime" , Value :: scalar( 1_467_969_011.0 ) ) ,
308
+ ( "exampleNaiveTime" , Value :: scalar( "16:07:08" ) ) ,
268
309
(
269
310
"exampleDateTimeFixedOffset" ,
270
311
Value :: scalar( "1996-12-19T16:39:57-08:00" ) ,
0 commit comments