juniper/integrations/
uuid.rs

1//! GraphQL support for [`uuid`] crate types.
2//!
3//! # Supported types
4//!
5//! | Rust type | GraphQL scalar |
6//! |-----------|----------------|
7//! | [`Uuid`]  | [`UUID`][s1]   |
8//!
9//! [`Uuid`]: uuid::Uuid
10//! [s1]: https://graphql-scalars.dev/docs/scalars/uuid
11
12use crate::{ScalarValue, graphql_scalar};
13
14/// [Universally Unique Identifier][0] (UUID).
15///
16/// [`UUID` scalar][1] compliant.
17///
18/// See also [`uuid::Uuid`][2] for details.
19///
20/// [0]: https://en.wikipedia.org/wiki/Universally_unique_identifier
21/// [1]: https://graphql-scalars.dev/docs/scalars/uuid
22/// [2]: https://docs.rs/uuid/*/uuid/struct.Uuid.html
23#[graphql_scalar]
24#[graphql(
25    name = "UUID",
26    with = uuid_scalar,
27    to_output_with = ScalarValue::from_displayable,
28    parse_token(String),
29    specified_by_url = "https://graphql-scalars.dev/docs/scalars/uuid",
30)]
31type Uuid = uuid::Uuid;
32
33mod uuid_scalar {
34    use super::Uuid;
35
36    pub(super) fn from_input(s: &str) -> Result<Uuid, Box<str>> {
37        Uuid::parse_str(s).map_err(|e| format!("Failed to parse `UUID`: {e}").into())
38    }
39}
40
41#[cfg(test)]
42mod test {
43    use uuid::Uuid;
44
45    use crate::{FromInputValue, InputValue, graphql_input_value};
46
47    #[test]
48    fn uuid_from_input() {
49        let raw = "123e4567-e89b-12d3-a456-426655440000";
50        let input: InputValue = graphql_input_value!((raw));
51
52        let parsed: Uuid = FromInputValue::from_input_value(&input).unwrap();
53        let id = Uuid::parse_str(raw).unwrap();
54
55        assert_eq!(parsed, id);
56    }
57}