Skip to content

Commit b75e1aa

Browse files
committed
Support Jiff's "friendly" format as input for jiff::Duration GraphQL scalar
1 parent 497c839 commit b75e1aa

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

juniper/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ fnv = "1.0.5"
5353
futures = { version = "0.3.22", features = ["alloc"], default-features = false }
5454
graphql-parser = { version = "0.4", optional = true }
5555
indexmap = { version = "2.0", features = ["serde"] }
56-
jiff = { version = "0.1.5", features = ["std"], default-features = false, optional = true }
56+
jiff = { version = "0.1.16", features = ["std"], default-features = false, optional = true }
5757
juniper_codegen = { version = "0.16.0", path = "../juniper_codegen" }
5858
rust_decimal = { version = "1.20", default-features = false, optional = true }
5959
ryu = { version = "1.0", optional = true }
@@ -78,7 +78,7 @@ void = { version = "1.0.2", optional = true }
7878
[dev-dependencies]
7979
bencher = "0.1.2"
8080
chrono = { version = "0.4.30", features = ["alloc"], default-features = false }
81-
jiff = { version = "0.1.5", features = ["tzdb-bundle-always"], default-features = false }
81+
jiff = { version = "0.1.16", features = ["tzdb-bundle-always"], default-features = false }
8282
pretty_assertions = "1.0.0"
8383
serde_json = "1.0.18"
8484
serial_test = "3.0"

juniper/src/integrations/jiff.rs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,81 @@ mod duration_test {
11701170
}
11711171
}
11721172

1173+
#[test]
1174+
fn parses_jiff_friendly_input() {
1175+
for (raw, expected) in [
1176+
("40d", 40.days()),
1177+
("40 days", 40.days()),
1178+
("1y1d", 1.year().days(1)),
1179+
("1yr 1d", 1.year().days(1)),
1180+
("3d4h59m", 3.days().hours(4).minutes(59)),
1181+
("3 days, 4 hours, 59 minutes", 3.days().hours(4).minutes(59)),
1182+
("3d 4h 59m", 3.days().hours(4).minutes(59)),
1183+
("2h30m", 2.hours().minutes(30)),
1184+
("2h 30m", 2.hours().minutes(30)),
1185+
("1mo", 1.month()),
1186+
("1w", 1.week()),
1187+
("1 week", 1.week()),
1188+
("1w4d", 1.week().days(4)),
1189+
("1 wk 4 days", 1.week().days(4)),
1190+
("1m", 1.minute()),
1191+
("0.0021s", 2.milliseconds().microseconds(100)),
1192+
("0s", 0.seconds()),
1193+
("0d", 0.seconds()),
1194+
("0 days", 0.seconds()),
1195+
(
1196+
"1y1mo1d1h1m1.1s",
1197+
1.year()
1198+
.months(1)
1199+
.days(1)
1200+
.hours(1)
1201+
.minutes(1)
1202+
.seconds(1)
1203+
.milliseconds(100),
1204+
),
1205+
(
1206+
"1yr 1mo 1day 1hr 1min 1.1sec",
1207+
1.year()
1208+
.months(1)
1209+
.days(1)
1210+
.hours(1)
1211+
.minutes(1)
1212+
.seconds(1)
1213+
.milliseconds(100),
1214+
),
1215+
(
1216+
"1 year, 1 month, 1 day, 1 hour, 1 minute 1.1 seconds",
1217+
1.year()
1218+
.months(1)
1219+
.days(1)
1220+
.hours(1)
1221+
.minutes(1)
1222+
.seconds(1)
1223+
.milliseconds(100),
1224+
),
1225+
(
1226+
"1 year, 1 month, 1 day, 01:01:01.1",
1227+
1.year()
1228+
.months(1)
1229+
.days(1)
1230+
.hours(1)
1231+
.minutes(1)
1232+
.seconds(1)
1233+
.milliseconds(100),
1234+
),
1235+
] {
1236+
let input: InputValue = graphql_input_value!((raw));
1237+
let parsed = Duration::from_input_value(&input);
1238+
1239+
assert!(
1240+
parsed.is_ok(),
1241+
"failed to parse `{raw}`: {:?}",
1242+
parsed.unwrap_err(),
1243+
);
1244+
assert_eq!(parsed.unwrap(), expected, "input: {raw}");
1245+
}
1246+
}
1247+
11731248
#[test]
11741249
fn fails_on_invalid_input() {
11751250
for input in [
@@ -1178,7 +1253,6 @@ mod duration_test {
11781253
graphql_input_value!("P0"),
11791254
graphql_input_value!("PT"),
11801255
graphql_input_value!("PTS"),
1181-
graphql_input_value!("56:34:22"),
11821256
graphql_input_value!("1996-12-19"),
11831257
graphql_input_value!("1996-12-19T14:23:43"),
11841258
graphql_input_value!("1996-12-19T14:23:43Z"),

0 commit comments

Comments
 (0)