Skip to content

Commit bfa607f

Browse files
committed
impl GraphQLScalar for NaiveTime
1 parent d13305f commit bfa607f

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

juniper/src/integrations/chrono.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,29 @@ where
9999
}
100100
}
101101

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+
102125
// JSON numbers (i.e. IEEE doubles) are not precise enough for nanosecond
103126
// datetimes. Values will be truncated to microsecond resolution.
104127
#[crate::graphql_scalar_internal(description = "NaiveDateTime")]
@@ -194,6 +217,19 @@ mod test {
194217
assert_eq!(parsed.day(), d);
195218
}
196219

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+
197233
#[test]
198234
fn naivedatetime_from_input_value() {
199235
let raw = 1_000_000_000_f64;
@@ -230,6 +266,9 @@ mod integration_test {
230266
fn exampleNaiveDateTime() -> NaiveDateTime {
231267
NaiveDate::from_ymd(2016, 7, 8).and_hms(9, 10, 11)
232268
}
269+
fn exampleNaiveTime() -> NaiveTime {
270+
NaiveTime::from_hms(16, 7, 8)
271+
}
233272
fn exampleDateTimeFixedOffset() -> DateTime<FixedOffset> {
234273
DateTime::parse_from_rfc3339("1996-12-19T16:39:57-08:00").unwrap()
235274
}
@@ -242,6 +281,7 @@ mod integration_test {
242281
{
243282
exampleNaiveDate,
244283
exampleNaiveDateTime,
284+
exampleNaiveTime,
245285
exampleDateTimeFixedOffset,
246286
exampleDateTimeUtc,
247287
}
@@ -265,6 +305,7 @@ mod integration_test {
265305
vec![
266306
("exampleNaiveDate", Value::scalar("2015-03-14")),
267307
("exampleNaiveDateTime", Value::scalar(1_467_969_011.0)),
308+
("exampleNaiveTime", Value::scalar("16:07:08")),
268309
(
269310
"exampleDateTimeFixedOffset",
270311
Value::scalar("1996-12-19T16:39:57-08:00"),

0 commit comments

Comments
 (0)