juniper/integrations/
url.rs

1//! GraphQL support for [url](https://github.com/servo/rust-url) types.
2
3use crate::{graphql_scalar, InputValue, ScalarValue, Value};
4
5#[graphql_scalar(with = url_scalar, parse_token(String))]
6type Url = url::Url;
7
8mod url_scalar {
9    use super::*;
10
11    pub(super) fn to_output<S: ScalarValue>(v: &Url) -> Value<S> {
12        Value::scalar(v.as_str().to_owned())
13    }
14
15    pub(super) fn from_input<S: ScalarValue>(v: &InputValue<S>) -> Result<Url, String> {
16        v.as_string_value()
17            .ok_or_else(|| format!("Expected `String`, found: {v}"))
18            .and_then(|s| Url::parse(s).map_err(|e| format!("Failed to parse `Url`: {e}")))
19    }
20}
21
22#[cfg(test)]
23mod test {
24    use url::Url;
25
26    use crate::{graphql_input_value, InputValue};
27
28    #[test]
29    fn url_from_input() {
30        let raw = "https://example.net/";
31        let input: InputValue = graphql_input_value!((raw));
32
33        let parsed: Url = crate::FromInputValue::from_input_value(&input).unwrap();
34        let url = Url::parse(raw).unwrap();
35
36        assert_eq!(parsed, url);
37    }
38}