Skip to content

Commit 6e4bc12

Browse files
Add support for bson::UtcDateTime (#585)
1 parent 3b465cb commit 6e4bc12

File tree

3 files changed

+85
-46
lines changed

3 files changed

+85
-46
lines changed

juniper/src/integrations/bson.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
use bson::{oid::ObjectId, UtcDateTime};
2+
use chrono::prelude::*;
3+
4+
use crate::{
5+
parser::{ParseError, ScalarToken, Token},
6+
value::ParseScalarResult,
7+
Value,
8+
};
9+
10+
graphql_scalar!(ObjectId where Scalar = <S> {
11+
description: "ObjectId"
12+
13+
resolve(&self) -> Value {
14+
Value::scalar(self.to_hex())
15+
}
16+
17+
from_input_value(v: &InputValue) -> Option<ObjectId> {
18+
v.as_string_value()
19+
.and_then(|s| ObjectId::with_string(s).ok())
20+
}
21+
22+
from_str<'a>(value: ScalarToken<'a>) -> ParseScalarResult<'a, S> {
23+
if let ScalarToken::String(value) = value {
24+
Ok(S::from(value.to_owned()))
25+
} else {
26+
Err(ParseError::UnexpectedToken(Token::Scalar(value)))
27+
}
28+
}
29+
});
30+
31+
graphql_scalar!(UtcDateTime where Scalar = <S> {
32+
description: "UtcDateTime"
33+
34+
resolve(&self) -> Value {
35+
Value::scalar((*self).to_rfc3339())
36+
}
37+
38+
from_input_value(v: &InputValue) -> Option<UtcDateTime> {
39+
v.as_string_value()
40+
.and_then(|s| (s.parse::<DateTime<Utc>>().ok()))
41+
.map(|d| UtcDateTime(d))
42+
}
43+
44+
from_str<'a>(value: ScalarToken<'a>) -> ParseScalarResult<'a, S> {
45+
if let ScalarToken::String(value) = value {
46+
Ok(S::from(value.to_owned()))
47+
} else {
48+
Err(ParseError::UnexpectedToken(Token::Scalar(value)))
49+
}
50+
}
51+
});
52+
53+
#[cfg(test)]
54+
mod test {
55+
use crate::{value::DefaultScalarValue, InputValue};
56+
use bson::{oid::ObjectId, UtcDateTime};
57+
use chrono::prelude::*;
58+
59+
#[test]
60+
fn objectid_from_input_value() {
61+
let raw = "53e37d08776f724e42000000";
62+
let input: InputValue<DefaultScalarValue> = InputValue::scalar(raw.to_string());
63+
64+
let parsed: ObjectId = crate::FromInputValue::from_input_value(&input).unwrap();
65+
let id = ObjectId::with_string(raw).unwrap();
66+
67+
assert_eq!(parsed, id);
68+
}
69+
70+
#[test]
71+
fn utcdatetime_from_input_value() {
72+
let raw = "2020-03-23T17:38:32.446+00:00";
73+
let input: InputValue<DefaultScalarValue> = InputValue::scalar(raw.to_string());
74+
75+
let parsed: UtcDateTime = crate::FromInputValue::from_input_value(&input).unwrap();
76+
let date_time = UtcDateTime(
77+
DateTime::parse_from_rfc3339(raw)
78+
.unwrap()
79+
.with_timezone(&Utc),
80+
);
81+
82+
assert_eq!(parsed, date_time);
83+
}
84+
}

juniper/src/integrations/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ pub mod uuid;
1616

1717
#[cfg(feature = "bson")]
1818
/// GraphQL support for [bson](https://github.com/mongodb/bson-rust) types.
19-
pub mod objectid;
19+
pub mod bson;

juniper/src/integrations/objectid.rs

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)