juniper/integrations/
uuid.rs

1//! GraphQL support for [uuid](https://doc.rust-lang.org/uuid/uuid/struct.Uuid.html) types.
2
3#![allow(clippy::needless_lifetimes)]
4
5use crate::{graphql_scalar, InputValue, ScalarValue, Value};
6
7#[graphql_scalar(with = uuid_scalar, parse_token(String))]
8type Uuid = uuid::Uuid;
9
10mod uuid_scalar {
11    use super::*;
12
13    pub(super) fn to_output<S: ScalarValue>(v: &Uuid) -> Value<S> {
14        Value::scalar(v.to_string())
15    }
16
17    pub(super) fn from_input<S: ScalarValue>(v: &InputValue<S>) -> Result<Uuid, String> {
18        v.as_string_value()
19            .ok_or_else(|| format!("Expected `String`, found: {v}"))
20            .and_then(|s| Uuid::parse_str(s).map_err(|e| format!("Failed to parse `Uuid`: {e}")))
21    }
22}
23
24#[cfg(test)]
25mod test {
26    use uuid::Uuid;
27
28    use crate::{graphql_input_value, FromInputValue, InputValue};
29
30    #[test]
31    fn uuid_from_input() {
32        let raw = "123e4567-e89b-12d3-a456-426655440000";
33        let input: InputValue = graphql_input_value!((raw));
34
35        let parsed: Uuid = FromInputValue::from_input_value(&input).unwrap();
36        let id = Uuid::parse_str(raw).unwrap();
37
38        assert_eq!(parsed, id);
39    }
40}