juniper/integrations/
url.rs1use 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}