This commit is contained in:
parent
f3170c7adf
commit
4ffd276a5b
3 changed files with 289 additions and 3 deletions
|
@ -94,3 +94,46 @@ mod fallible {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod raw_argument {
|
||||||
|
use juniper::{
|
||||||
|
graphql_object, graphql_value, EmptyMutation, EmptySubscription, RootNode, Variables,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Obj;
|
||||||
|
|
||||||
|
#[graphql_object]
|
||||||
|
impl Obj {
|
||||||
|
#[graphql(arguments(r#arg(description = "The only argument")))]
|
||||||
|
fn test(&self, arg: String) -> String {
|
||||||
|
arg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn named_correctly() {
|
||||||
|
let doc = r#"{
|
||||||
|
__type(name: "Obj") {
|
||||||
|
fields {
|
||||||
|
args {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}"#;
|
||||||
|
|
||||||
|
let schema = RootNode::new(
|
||||||
|
Obj,
|
||||||
|
EmptyMutation::<()>::new(),
|
||||||
|
EmptySubscription::<()>::new(),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
juniper::execute(&doc, None, &schema, &Variables::new(), &()).await,
|
||||||
|
Ok((
|
||||||
|
graphql_value!({"__type": {"fields": [{"args": [{"name": "arg"}]}]}}),
|
||||||
|
vec![],
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -58,6 +58,11 @@ impl Root {
|
||||||
arg
|
arg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[graphql(arguments(r#arg(description = "The arg")))]
|
||||||
|
fn single_arg_descr_raw_idents(arg: i32) -> i32 {
|
||||||
|
arg
|
||||||
|
}
|
||||||
|
|
||||||
#[graphql(arguments(
|
#[graphql(arguments(
|
||||||
arg1(description = "The first arg",),
|
arg1(description = "The first arg",),
|
||||||
arg2(description = "The second arg")
|
arg2(description = "The second arg")
|
||||||
|
@ -66,9 +71,17 @@ impl Root {
|
||||||
arg1 + arg2
|
arg1 + arg2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[graphql(arguments(
|
||||||
|
r#arg1(description = "The first arg",),
|
||||||
|
r#arg2(description = "The second arg")
|
||||||
|
))]
|
||||||
|
fn multi_args_descr_raw_idents(arg1: i32, arg2: i32) -> i32 {
|
||||||
|
arg1 + arg2
|
||||||
|
}
|
||||||
|
|
||||||
#[graphql(arguments(
|
#[graphql(arguments(
|
||||||
arg1(description = "The first arg",),
|
arg1(description = "The first arg",),
|
||||||
arg2(description = "The second arg")
|
arg2(description = "The second arg",)
|
||||||
))]
|
))]
|
||||||
fn multi_args_descr_trailing_comma(arg1: i32, arg2: i32) -> i32 {
|
fn multi_args_descr_trailing_comma(arg1: i32, arg2: i32) -> i32 {
|
||||||
arg1 + arg2
|
arg1 + arg2
|
||||||
|
@ -106,6 +119,11 @@ impl Root {
|
||||||
arg
|
arg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[graphql(arguments(r#arg(default = 123, description = "The arg")))]
|
||||||
|
fn arg_with_default_descr_raw_ident(arg: i32) -> i32 {
|
||||||
|
arg
|
||||||
|
}
|
||||||
|
|
||||||
#[graphql(arguments(
|
#[graphql(arguments(
|
||||||
arg1(default = 123, description = "The first arg"),
|
arg1(default = 123, description = "The first arg"),
|
||||||
arg2(default = 456, description = "The second arg")
|
arg2(default = 456, description = "The second arg")
|
||||||
|
@ -114,6 +132,14 @@ impl Root {
|
||||||
arg1 + arg2
|
arg1 + arg2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[graphql(arguments(
|
||||||
|
r#arg1(default = 123, description = "The first arg"),
|
||||||
|
r#arg2(default = 456, description = "The second arg")
|
||||||
|
))]
|
||||||
|
fn multi_args_with_default_descr_raw_ident(arg1: i32, arg2: i32) -> i32 {
|
||||||
|
arg1 + arg2
|
||||||
|
}
|
||||||
|
|
||||||
#[graphql(arguments(
|
#[graphql(arguments(
|
||||||
arg1(default = 123, description = "The first arg",),
|
arg1(default = 123, description = "The first arg",),
|
||||||
arg2(default = 456, description = "The second arg",)
|
arg2(default = 456, description = "The second arg",)
|
||||||
|
@ -122,6 +148,14 @@ impl Root {
|
||||||
arg1 + arg2
|
arg1 + arg2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[graphql(arguments(
|
||||||
|
r#arg1(default = 123, description = "The first arg",),
|
||||||
|
r#arg2(default = 456, description = "The second arg",)
|
||||||
|
))]
|
||||||
|
fn multi_args_with_default_trailing_comma_descr_raw_ident(arg1: i32, arg2: i32) -> i32 {
|
||||||
|
arg1 + arg2
|
||||||
|
}
|
||||||
|
|
||||||
#[graphql(
|
#[graphql(
|
||||||
arguments(
|
arguments(
|
||||||
arg1(
|
arg1(
|
||||||
|
@ -460,6 +494,40 @@ async fn introspect_field_single_arg_descr() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn introspect_field_single_arg_descr_raw_idents() {
|
||||||
|
run_args_info_query("singleArgDescrRawIdents", |args| {
|
||||||
|
assert_eq!(args.len(), 1);
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg")),
|
||||||
|
("description", Value::scalar("The arg")),
|
||||||
|
("defaultValue", Value::null()),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::null()),
|
||||||
|
(
|
||||||
|
"ofType",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int"))].into_iter().collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn introspect_field_multi_args_descr() {
|
async fn introspect_field_multi_args_descr() {
|
||||||
run_args_info_query("multiArgsDescr", |args| {
|
run_args_info_query("multiArgsDescr", |args| {
|
||||||
|
@ -520,6 +588,66 @@ async fn introspect_field_multi_args_descr() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn introspect_field_multi_args_descr_raw_idents() {
|
||||||
|
run_args_info_query("multiArgsDescrRawIdents", |args| {
|
||||||
|
assert_eq!(args.len(), 2);
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg1")),
|
||||||
|
("description", Value::scalar("The first arg")),
|
||||||
|
("defaultValue", Value::null()),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::null()),
|
||||||
|
(
|
||||||
|
"ofType",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int"))].into_iter().collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg2")),
|
||||||
|
("description", Value::scalar("The second arg")),
|
||||||
|
("defaultValue", Value::null()),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::null()),
|
||||||
|
(
|
||||||
|
"ofType",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int"))].into_iter().collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn introspect_field_multi_args_descr_trailing_comma() {
|
async fn introspect_field_multi_args_descr_trailing_comma() {
|
||||||
run_args_info_query("multiArgsDescrTrailingComma", |args| {
|
run_args_info_query("multiArgsDescrTrailingComma", |args| {
|
||||||
|
@ -786,6 +914,32 @@ async fn introspect_field_arg_with_default_descr() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn introspect_field_arg_with_default_descr_raw_ident() {
|
||||||
|
run_args_info_query("argWithDefaultDescrRawIdent", |args| {
|
||||||
|
assert_eq!(args.len(), 1);
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg")),
|
||||||
|
("description", Value::scalar("The arg")),
|
||||||
|
("defaultValue", Value::scalar("123")),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int")), ("ofType", Value::null())]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn introspect_field_multi_args_with_default_descr() {
|
async fn introspect_field_multi_args_with_default_descr() {
|
||||||
run_args_info_query("multiArgsWithDefaultDescr", |args| {
|
run_args_info_query("multiArgsWithDefaultDescr", |args| {
|
||||||
|
@ -830,6 +984,50 @@ async fn introspect_field_multi_args_with_default_descr() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn introspect_field_multi_args_with_default_descr_raw_ident() {
|
||||||
|
run_args_info_query("multiArgsWithDefaultDescrRawIdent", |args| {
|
||||||
|
assert_eq!(args.len(), 2);
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg1")),
|
||||||
|
("description", Value::scalar("The first arg")),
|
||||||
|
("defaultValue", Value::scalar("123")),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int")), ("ofType", Value::null())]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg2")),
|
||||||
|
("description", Value::scalar("The second arg")),
|
||||||
|
("defaultValue", Value::scalar("456")),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int")), ("ofType", Value::null())]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn introspect_field_multi_args_with_default_trailing_comma_descr() {
|
async fn introspect_field_multi_args_with_default_trailing_comma_descr() {
|
||||||
run_args_info_query("multiArgsWithDefaultTrailingCommaDescr", |args| {
|
run_args_info_query("multiArgsWithDefaultTrailingCommaDescr", |args| {
|
||||||
|
@ -874,6 +1072,50 @@ async fn introspect_field_multi_args_with_default_trailing_comma_descr() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn introspect_field_multi_args_with_default_trailing_comma_descr_raw_ident() {
|
||||||
|
run_args_info_query("multiArgsWithDefaultTrailingCommaDescrRawIdent", |args| {
|
||||||
|
assert_eq!(args.len(), 2);
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg1")),
|
||||||
|
("description", Value::scalar("The first arg")),
|
||||||
|
("defaultValue", Value::scalar("123")),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int")), ("ofType", Value::null())]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
|
||||||
|
assert!(args.contains(&Value::object(
|
||||||
|
vec![
|
||||||
|
("name", Value::scalar("arg2")),
|
||||||
|
("description", Value::scalar("The second arg")),
|
||||||
|
("defaultValue", Value::scalar("456")),
|
||||||
|
(
|
||||||
|
"type",
|
||||||
|
Value::object(
|
||||||
|
vec![("name", Value::scalar("Int")), ("ofType", Value::null())]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
)));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn introspect_field_args_with_complex_default() {
|
async fn introspect_field_args_with_complex_default() {
|
||||||
run_args_info_query("argsWithComplexDefault", |args| {
|
run_args_info_query("argsWithComplexDefault", |args| {
|
||||||
|
|
|
@ -11,11 +11,12 @@ use proc_macro_error::abort;
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use span_container::SpanContainer;
|
use span_container::SpanContainer;
|
||||||
use syn::{
|
use syn::{
|
||||||
|
ext::IdentExt as _,
|
||||||
parse::{Parse, ParseStream},
|
parse::{Parse, ParseStream},
|
||||||
parse_quote,
|
parse_quote,
|
||||||
punctuated::Punctuated,
|
punctuated::Punctuated,
|
||||||
spanned::Spanned,
|
spanned::Spanned,
|
||||||
token, Attribute, Lit, Meta, MetaList, MetaNameValue, NestedMeta,
|
token, Attribute, Ident, Lit, Meta, MetaList, MetaNameValue, NestedMeta,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::common::parse::ParseBufferExt as _;
|
use crate::common::parse::ParseBufferExt as _;
|
||||||
|
@ -450,7 +451,7 @@ pub struct FieldAttributeArgument {
|
||||||
|
|
||||||
impl Parse for FieldAttributeArgument {
|
impl Parse for FieldAttributeArgument {
|
||||||
fn parse(input: ParseStream) -> syn::Result<Self> {
|
fn parse(input: ParseStream) -> syn::Result<Self> {
|
||||||
let name = input.parse()?;
|
let name = input.parse::<Ident>()?.unraw();
|
||||||
|
|
||||||
let mut arg = Self {
|
let mut arg = Self {
|
||||||
name,
|
name,
|
||||||
|
|
Loading…
Reference in a new issue