From 01b2dea84885eaa27bc2df1d6250b451acaf744d Mon Sep 17 00:00:00 2001 From: theduke <chris@theduke.at> Date: Mon, 28 Aug 2017 08:55:23 +0200 Subject: [PATCH] uuid feature: Implement uuid::Uuid as a scalar type Fixes #86 --- juniper/Cargo.toml | 2 ++ juniper/src/integrations/mod.rs | 3 +++ juniper/src/integrations/uuid.rs | 32 ++++++++++++++++++++++++++++++++ juniper/src/lib.rs | 4 ++++ 4 files changed, 41 insertions(+) create mode 100644 juniper/src/integrations/uuid.rs diff --git a/juniper/Cargo.toml b/juniper/Cargo.toml index 8075528a..cb92caa5 100644 --- a/juniper/Cargo.toml +++ b/juniper/Cargo.toml @@ -22,11 +22,13 @@ path = "benches/bench.rs" [features] nightly = [] expose-test-schema = [] +default = ["uuid"] [dependencies] serde = { version = "^1.0.8" } serde_derive = {version="^1.0.8" } serde_json = { version="^1.0.2", optional = true } +uuid = { version = "0.5.1", optional = true } [dev-dependencies] bencher = "^0.1.2" diff --git a/juniper/src/integrations/mod.rs b/juniper/src/integrations/mod.rs index 82b2d094..a4a7803c 100644 --- a/juniper/src/integrations/mod.rs +++ b/juniper/src/integrations/mod.rs @@ -1 +1,4 @@ pub mod serde; + +#[cfg(feature = "uuid")] +mod uuid; diff --git a/juniper/src/integrations/uuid.rs b/juniper/src/integrations/uuid.rs new file mode 100644 index 00000000..b0806b28 --- /dev/null +++ b/juniper/src/integrations/uuid.rs @@ -0,0 +1,32 @@ +use uuid::Uuid; + +use ::Value; + +graphql_scalar!(Uuid { + description: "Uuid" + + resolve(&self) -> Value { + Value::string(self.to_string()) + } + + from_input_value(v: &InputValue) -> Option<Uuid> { + v.as_string_value() + .and_then(|s| Uuid::parse_str(s).ok()) + } +}); + +#[cfg(test)] +mod test { + use uuid::Uuid; + + #[test] + fn uuid_from_input_value() { + let raw = "123e4567-e89b-12d3-a456-426655440000"; + let input = ::InputValue::String(raw.to_string()); + + let parsed: Uuid = ::FromInputValue::from(&input).unwrap(); + let id = Uuid::parse_str(raw).unwrap(); + + assert_eq!(parsed, id); + } +} \ No newline at end of file diff --git a/juniper/src/lib.rs b/juniper/src/lib.rs index 7b6c8c38..e43d88e2 100644 --- a/juniper/src/lib.rs +++ b/juniper/src/lib.rs @@ -121,6 +121,10 @@ extern crate serde_derive; #[cfg(any(test, feature = "expose-test-schema"))] extern crate serde_json; + +#[cfg(any(test, feature = "uuid"))] +extern crate uuid; + use std::borrow::Cow; #[macro_use]