From b28acbd96dbbfc665bcd87c47773da3cb99a9a91 Mon Sep 17 00:00:00 2001 From: tyranron <tyranron@gmail.com> Date: Tue, 7 Jun 2022 19:03:39 +0200 Subject: [PATCH] Refactor `value!` macro position [skip ci] --- juniper/src/graphql/mod.rs | 6 +- juniper/src/lib.rs | 2 +- juniper/src/macros/input_value.rs | 2 +- juniper/src/macros/mod.rs | 5 +- .../src/macros/{graphql_value.rs => value.rs} | 185 +++++++++--------- 5 files changed, 103 insertions(+), 97 deletions(-) rename juniper/src/macros/{graphql_value.rs => value.rs} (62%) diff --git a/juniper/src/graphql/mod.rs b/juniper/src/graphql/mod.rs index 3deea79c..5b02afb9 100644 --- a/juniper/src/graphql/mod.rs +++ b/juniper/src/graphql/mod.rs @@ -1,8 +1,10 @@ use crate::{behavior, resolve}; pub use crate::{ - ast::InputValue, graphql_value as value, macros::input_value, - resolve::Type, value::Value, + ast::InputValue, + macros::{input_value, value}, + resolve::Type, + value::Value, }; pub trait Interface<S> diff --git a/juniper/src/lib.rs b/juniper/src/lib.rs index ea55733f..70c51418 100644 --- a/juniper/src/lib.rs +++ b/juniper/src/lib.rs @@ -75,8 +75,8 @@ pub use crate::{ }, introspection::IntrospectionFormat, macros::{ - input_value as graphql_input_value, helper::subscription::{ExtractTypeFromStream, IntoFieldResult}, + input_value as graphql_input_value, value as graphql_value, }, parser::{ParseError, ScalarToken, Spanning}, schema::{ diff --git a/juniper/src/macros/input_value.rs b/juniper/src/macros/input_value.rs index 0edc0600..627b4f63 100644 --- a/juniper/src/macros/input_value.rs +++ b/juniper/src/macros/input_value.rs @@ -7,7 +7,7 @@ /// - [`InputValue::Enum`] is constructed with `ident`, so to capture outer /// variable as [`InputValue::Scalar`] surround it with parens: `(var)`. /// ```rust -/// # use juniper::{graphql, graphql_value}; +/// # use juniper::graphql; /// # /// # type InputValue = graphql::InputValue; /// # type Value = graphql::Value; diff --git a/juniper/src/macros/mod.rs b/juniper/src/macros/mod.rs index ebde9761..37bd0218 100644 --- a/juniper/src/macros/mod.rs +++ b/juniper/src/macros/mod.rs @@ -7,10 +7,9 @@ pub mod helper; pub mod reflect; mod input_value; -#[macro_use] -mod graphql_value; +mod value; #[macro_use] mod graphql_vars; #[doc(inline)] -pub use self::input_value::input_value; +pub use self::{input_value::input_value, value::value}; diff --git a/juniper/src/macros/graphql_value.rs b/juniper/src/macros/value.rs similarity index 62% rename from juniper/src/macros/graphql_value.rs rename to juniper/src/macros/value.rs index cc4e34d3..c689afa6 100644 --- a/juniper/src/macros/graphql_value.rs +++ b/juniper/src/macros/value.rs @@ -1,19 +1,18 @@ -//! [`graphql_value!`] macro implementation. -//! -//! [`graphql_value!`]: graphql_value +//! [`value!`] macro implementation. -/// Constructs [`Value`]s via JSON-like syntax. +/// Constructs [`graphql::Value`]s via JSON-like syntax. /// -/// [`Value`] objects are used mostly when creating custom errors from fields. +/// [`graphql::Value`] objects are used mostly when creating custom errors from +/// fields. /// /// [`Value::Object`] key should implement [`AsRef`]`<`[`str`]`>`. /// ```rust -/// # use juniper::{graphql_value, Value}; +/// # use juniper::graphql; /// # /// let code = 200; /// let features = ["key", "value"]; /// -/// let value: Value = graphql_value!({ +/// let value: graphql::Value = graphql::value!({ /// "code": code, /// "success": code == 200, /// "payload": { @@ -26,94 +25,93 @@ /// /// Resulting JSON will look just like what you passed in. /// ```rust -/// # use juniper::{graphql_value, DefaultScalarValue, Value}; +/// # use juniper::graphql; /// # -/// # type V = Value<DefaultScalarValue>; +/// # type V = graphql::Value; /// # /// # let _: V = -/// graphql_value!(null); +/// graphql::value!(null); /// # let _: V = -/// graphql_value!(1234); +/// graphql::value!(1234); /// # let _: V = -/// graphql_value!("test"); +/// graphql::value!("test"); /// # let _: V = -/// graphql_value!([1234, "test", true]); +/// graphql::value!([1234, "test", true]); /// # let _: V = -/// graphql_value!({"key": "value", "foo": 1234}); +/// graphql::value!({"key": "value", "foo": 1234}); /// ``` /// -/// [`Value`]: crate::Value -/// [`Value::Object`]: crate::Value::Object -#[macro_export] -macro_rules! graphql_value { +/// [`graphql::Value`]: crate::graphql::Value +/// [`Value::Object`]: crate::graphql::Value::Object +macro_rules! value { /////////// // Array // /////////// // Done with trailing comma. (@array [$($elems:expr,)*]) => { - $crate::Value::list(vec![ + $crate::graphql::Value::list(::std::vec![ $( $elems, )* ]) }; // Done without trailing comma. (@array [$($elems:expr),*]) => { - $crate::Value::list(vec![ - $( $crate::graphql_value!($elems), )* + $crate::graphql::Value::list(::std::vec![ + $( $crate::graphql::value!($elems), )* ]) }; // Next element is `null`. (@array [$($elems:expr,)*] null $($rest:tt)*) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!(null)] $($rest)* + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!(null)] $($rest)* ) }; // Next element is `None`. (@array [$($elems:expr,)*] None $($rest:tt)*) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!(None)] $($rest)* + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!(None)] $($rest)* ) }; // Next element is an array. (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!([$($array)*])] $($rest)* + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!([$($array)*])] $($rest)* ) }; // Next element is a map. (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!({$($map)*})] $($rest)* + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!({$($map)*})] $($rest)* ) }; // Next element is an expression followed by comma. (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!($next),] $($rest)* + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!($next),] $($rest)* ) }; // Last element is an expression with no trailing comma. (@array [$($elems:expr,)*] $last:expr) => { - $crate::graphql_value!( - @array [$($elems,)* $crate::graphql_value!($last)] + $crate::graphql::value!( + @array [$($elems,)* $crate::graphql::value!($last)] ) }; // Comma after the most recent element. (@array [$($elems:expr),*] , $($rest:tt)*) => { - $crate::graphql_value!(@array [$($elems,)*] $($rest)*) + $crate::graphql::value!(@array [$($elems,)*] $($rest)*) }; // Unexpected token after most recent element. (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => { - $crate::graphql_value!(@unexpected $unexpected) + $crate::graphql::value!(@unexpected $unexpected) }; //////////// @@ -126,12 +124,12 @@ macro_rules! graphql_value { // Insert the current entry followed by trailing comma. (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => { let _ = $object.add_field(($($key)+), $value); - $crate::graphql_value!(@object $object () ($($rest)*) ($($rest)*)); + $crate::graphql::value!(@object $object () ($($rest)*) ($($rest)*)); }; // Current entry followed by unexpected token. (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => { - $crate::graphql_value!(@unexpected $unexpected); + $crate::graphql::value!(@unexpected $unexpected); }; // Insert the last entry without trailing comma. @@ -141,97 +139,97 @@ macro_rules! graphql_value { // Next value is `null`. (@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!(null)) $($rest)* + ($crate::graphql::value!(null)) $($rest)* ); }; // Next value is `None`. (@object $object:ident ($($key:tt)+) (: None $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!(None)) $($rest)* + ($crate::graphql::value!(None)) $($rest)* ); }; // Next value is an array. (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!([$($array)*])) $($rest)* + ($crate::graphql::value!([$($array)*])) $($rest)* ); }; // Next value is a map. (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!({$($map)*})) $($rest)* + ($crate::graphql::value!({$($map)*})) $($rest)* ); }; // Next value is an expression followed by comma. (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!($value)) , $($rest)* + ($crate::graphql::value!($value)) , $($rest)* ); }; // Last value is an expression with no trailing comma. (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object [$($key)+] - ($crate::graphql_value!($value)) + ($crate::graphql::value!($value)) ); }; // Missing value for last entry. Trigger a reasonable error message. (@object $object:ident ($($key:tt)+) (:) $copy:tt) => { // "unexpected end of macro invocation" - $crate::graphql_value!(); + $crate::graphql::value!(); }; // Missing colon and value for last entry. Trigger a reasonable error // message. (@object $object:ident ($($key:tt)+) () $copy:tt) => { // "unexpected end of macro invocation" - $crate::graphql_value!(); + $crate::graphql::value!(); }; // Misplaced colon. Trigger a reasonable error message. (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => { // Takes no arguments so "no rules expected the token `:`". - $crate::graphql_value!(@unexpected $colon); + $crate::graphql::value!(@unexpected $colon); }; // Found a comma inside a key. Trigger a reasonable error message. (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => { // Takes no arguments so "no rules expected the token `,`". - $crate::graphql_value!(@unexpected $comma); + $crate::graphql::value!(@unexpected $comma); }; // Key is fully parenthesized. This avoids `clippy::double_parens` false // positives because the parenthesization may be necessary here. (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!(@object $object ($key) (: $($rest)*) (: $($rest)*)); + $crate::graphql::value!(@object $object ($key) (: $($rest)*) (: $($rest)*)); }; // Refuse to absorb colon token into key expression. (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => { - $crate::graphql_value!(@unexpected $($unexpected)+); + $crate::graphql::value!(@unexpected $($unexpected)+); }; // Munch a token into the current key. (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => { - $crate::graphql_value!( + $crate::graphql::value!( @object $object ($($key)* $tt) ($($rest)*) ($($rest)*) @@ -249,63 +247,70 @@ macro_rules! graphql_value { ////////////// ([ $($arr:tt)* ]$(,)?) => { - $crate::graphql_value!(@array [] $($arr)*) + $crate::graphql::value!(@array [] $($arr)*) }; ({}$(,)?) => { - $crate::Value::object($crate::Object::with_capacity(0)) + $crate::graphql::Value::object($crate::Object::with_capacity(0)) }; ({ $($map:tt)+ }$(,)?) => { - $crate::Value::object({ + $crate::graphql::Value::object({ let mut object = $crate::Object::with_capacity(0); - $crate::graphql_value!(@object object () ($($map)*) ($($map)*)); + $crate::graphql::value!(@object object () ($($map)*) ($($map)*)); object }) }; - (null$(,)?) => ($crate::Value::null()); + (null$(,)?) => ($crate::graphql::Value::null()); - (None$(,)?) => ($crate::Value::null()); + (None$(,)?) => ($crate::graphql::Value::null()); - ($e:expr$(,)?) => ($crate::Value::from($e)); + ($e:expr$(,)?) => ($crate::graphql::Value::from($e)); } +#[doc(inline)] +pub(super) use value; + #[cfg(test)] mod tests { - type V = crate::Value; + use crate::graphql; + + use super::value; + + type V = graphql::Value; #[test] fn null() { - assert_eq!(graphql_value!(null), V::Null); + assert_eq!(value!(null), V::Null); } #[test] fn scalar() { let val = 42; - assert_eq!(graphql_value!(1), V::scalar(1)); - assert_eq!(graphql_value!("val"), V::scalar("val")); - assert_eq!(graphql_value!(1.34), V::scalar(1.34)); - assert_eq!(graphql_value!(false), V::scalar(false)); - assert_eq!(graphql_value!(1 + 2), V::scalar(3)); - assert_eq!(graphql_value!(val), V::scalar(42)); + assert_eq!(value!(1), V::scalar(1)); + assert_eq!(value!("val"), V::scalar("val")); + assert_eq!(value!(1.34), V::scalar(1.34)); + assert_eq!(value!(false), V::scalar(false)); + assert_eq!(value!(1 + 2), V::scalar(3)); + assert_eq!(value!(val), V::scalar(42)); } #[test] fn list() { let val = 42; - assert_eq!(graphql_value!([]), V::list(vec![])); + assert_eq!(value!([]), V::list(vec![])); - assert_eq!(graphql_value!([null]), V::list(vec![V::Null])); + assert_eq!(value!([null]), V::list(vec![V::Null])); - assert_eq!(graphql_value!([1]), V::list(vec![V::scalar(1)])); - assert_eq!(graphql_value!([1 + 2]), V::list(vec![V::scalar(3)])); - assert_eq!(graphql_value!([val]), V::list(vec![V::scalar(42)])); + assert_eq!(value!([1]), V::list(vec![V::scalar(1)])); + assert_eq!(value!([1 + 2]), V::list(vec![V::scalar(3)])); + assert_eq!(value!([val]), V::list(vec![V::scalar(42)])); assert_eq!( - graphql_value!([1, [2], 3]), + value!([1, [2], 3]), V::list(vec![ V::scalar(1), V::list(vec![V::scalar(2)]), @@ -313,7 +318,7 @@ mod tests { ]), ); assert_eq!( - graphql_value!(["string", [2 + 3], true]), + value!(["string", [2 + 3], true]), V::list(vec![ V::scalar("string"), V::list(vec![V::scalar(5)]), @@ -327,31 +332,31 @@ mod tests { let val = 42; assert_eq!( - graphql_value!({}), + value!({}), V::object(Vec::<(String, _)>::new().into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": null }), + value!({ "key": null }), V::object(vec![("key", V::Null)].into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": 123 }), + value!({ "key": 123 }), V::object(vec![("key", V::scalar(123))].into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": 1 + 2 }), + value!({ "key": 1 + 2 }), V::object(vec![("key", V::scalar(3))].into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": [] }), + value!({ "key": [] }), V::object(vec![("key", V::list(vec![]))].into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": [null] }), + value!({ "key": [null] }), V::object(vec![("key", V::list(vec![V::Null]))].into_iter().collect()), ); assert_eq!( - graphql_value!({ "key": [1] }), + value!({ "key": [1] }), V::object( vec![("key", V::list(vec![V::scalar(1)]))] .into_iter() @@ -359,7 +364,7 @@ mod tests { ), ); assert_eq!( - graphql_value!({ "key": [1 + 2] }), + value!({ "key": [1 + 2] }), V::object( vec![("key", V::list(vec![V::scalar(3)]))] .into_iter() @@ -367,7 +372,7 @@ mod tests { ), ); assert_eq!( - graphql_value!({ "key": [val] }), + value!({ "key": [val] }), V::object( vec![("key", V::list(vec![V::scalar(42)]))] .into_iter() @@ -380,8 +385,8 @@ mod tests { fn option() { let val = Some(42); - assert_eq!(graphql_value!(None), V::Null); - assert_eq!(graphql_value!(Some(42)), V::scalar(42)); - assert_eq!(graphql_value!(val), V::scalar(42)); + assert_eq!(value!(None), V::Null); + assert_eq!(value!(Some(42)), V::scalar(42)); + assert_eq!(value!(val), V::scalar(42)); } }