Skip to content

Commit 907d78d

Browse files
authored
Merge pull request #14 from zaeleus/variables-type-alias
Add type alias for query variables
2 parents 80a2ace + e3500df commit 907d78d

File tree

17 files changed

+71
-63
lines changed

17 files changed

+71
-63
lines changed

benches/bench.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ extern crate juniper;
33

44
use bencher::Bencher;
55

6-
use std::collections::{HashMap};
7-
8-
use juniper::{execute, RootNode, EmptyMutation};
6+
use juniper::{execute, RootNode, EmptyMutation, Variables};
97
use juniper::tests::model::Database;
108

119
fn query_type_name(b: &mut Bencher) {
@@ -21,7 +19,7 @@ fn query_type_name(b: &mut Bencher) {
2119
}
2220
}"#;
2321

24-
b.iter(|| execute(doc, None, &schema, &HashMap::new(), &database));
22+
b.iter(|| execute(doc, None, &schema, &Variables::new(), &database));
2523
}
2624

2725
fn introspection_query(b: &mut Bencher) {
@@ -122,7 +120,7 @@ fn introspection_query(b: &mut Bencher) {
122120
}
123121
"#;
124122

125-
b.iter(|| execute(doc, None, &schema, &HashMap::new(), &database));
123+
b.iter(|| execute(doc, None, &schema, &Variables::new(), &database));
126124
}
127125

128126
benchmark_group!(queries, query_type_name, introspection_query);

src/ast.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::hash::Hash;
44
use std::vec;
55
use std::slice;
66

7+
use executor::Variables;
78
use parser::Spanning;
89

910
/// A type literal in the syntax tree
@@ -265,7 +266,7 @@ impl InputValue {
265266
}
266267

267268
/// Resolve all variables to their values.
268-
pub fn into_const(self, vars: &HashMap<String, InputValue>) -> InputValue {
269+
pub fn into_const(self, vars: &Variables) -> InputValue {
269270
match self {
270271
InputValue::Variable(v) => vars.get(&v)
271272
.map_or_else(InputValue::null, Clone::clone),

src/executor.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub enum FieldPath<'a> {
3636
/// of the current field stack, context, variables, and errors.
3737
pub struct Executor<'a, CtxT> where CtxT: 'a {
3838
fragments: &'a HashMap<&'a str, &'a Fragment<'a>>,
39-
variables: &'a HashMap<String, InputValue>,
39+
variables: &'a Variables,
4040
current_selection_set: Option<&'a [Selection<'a>]>,
4141
schema: &'a SchemaType<'a>,
4242
context: &'a CtxT,
@@ -61,6 +61,9 @@ pub type FieldResult<T> = Result<T, String>;
6161
/// The result of resolving an unspecified field
6262
pub type ExecutionResult = Result<Value, String>;
6363

64+
/// The map of variables used for substitution during query execution
65+
pub type Variables = HashMap<String, InputValue>;
66+
6467
#[doc(hidden)]
6568
pub trait IntoResolvable<'a, T: GraphQLType, C>: Sized {
6669
#[doc(hidden)]
@@ -221,7 +224,7 @@ impl<'a, CtxT> Executor<'a, CtxT> {
221224
}
222225

223226
#[doc(hidden)]
224-
pub fn variables(&self) -> &'a HashMap<String, InputValue> {
227+
pub fn variables(&self) -> &'a Variables {
225228
self.variables
226229
}
227230

@@ -294,7 +297,7 @@ pub fn execute_validated_query<'a, QueryT, MutationT, CtxT>(
294297
document: Document,
295298
operation_name: Option<&str>,
296299
root_node: &RootNode<QueryT, MutationT>,
297-
variables: &HashMap<String, InputValue>,
300+
variables: &Variables,
298301
context: &CtxT
299302
)
300303
-> Result<(Value, Vec<ExecutionError>), GraphQLError<'a>>

src/executor_tests/directives.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::collections::HashMap;
22

33
use value::Value;
44
use ast::InputValue;
5+
use executor::Variables;
56
use schema::model::RootNode;
67
use types::scalars::EmptyMutation;
78

@@ -17,7 +18,7 @@ graphql_object!(TestType: () |&self| {
1718
}
1819
});
1920

20-
fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
21+
fn run_variable_query<F>(query: &str, vars: Variables, f: F)
2122
where F: Fn(&HashMap<String, Value>) -> ()
2223
{
2324
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
@@ -37,7 +38,7 @@ fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
3738
fn run_query<F>(query: &str, f: F)
3839
where F: Fn(&HashMap<String, Value>) -> ()
3940
{
40-
run_variable_query(query, HashMap::new(), f);
41+
run_variable_query(query, Variables::new(), f);
4142
}
4243

4344
#[test]

src/executor_tests/enums.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::collections::HashMap;
22

33
use value::Value;
44
use ast::InputValue;
5+
use executor::Variables;
56
use schema::model::RootNode;
67
use ::GraphQLError::ValidationError;
78
use validation::RuleError;
@@ -28,7 +29,7 @@ graphql_object!(TestType: () |&self| {
2829
}
2930
});
3031

31-
fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
32+
fn run_variable_query<F>(query: &str, vars: Variables, f: F)
3233
where F: Fn(&HashMap<String, Value>) -> ()
3334
{
3435
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
@@ -48,7 +49,7 @@ fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
4849
fn run_query<F>(query: &str, f: F)
4950
where F: Fn(&HashMap<String, Value>) -> ()
5051
{
51-
run_variable_query(query, HashMap::new(), f);
52+
run_variable_query(query, Variables::new(), f);
5253
}
5354

5455
#[test]

src/executor_tests/introspection.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use std::collections::HashMap;
2-
1+
use executor::Variables;
32
use value::Value;
43
use schema::model::RootNode;
54
use types::scalars::EmptyMutation;
@@ -70,7 +69,7 @@ fn test_execution() {
7069
"#;
7170
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
7271

73-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
72+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
7473
.expect("Execution failed");
7574

7675
assert_eq!(errs, []);
@@ -107,7 +106,7 @@ fn enum_introspection() {
107106
"#;
108107
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
109108

110-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
109+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
111110
.expect("Execution failed");
112111

113112
assert_eq!(errs, []);
@@ -185,7 +184,7 @@ fn interface_introspection() {
185184
"#;
186185
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
187186

188-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
187+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
189188
.expect("Execution failed");
190189

191190
assert_eq!(errs, []);
@@ -286,7 +285,7 @@ fn object_introspection() {
286285
"#;
287286
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
288287

289-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
288+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
290289
.expect("Execution failed");
291290

292291
assert_eq!(errs, []);
@@ -398,7 +397,7 @@ fn scalar_introspection() {
398397
"#;
399398
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
400399

401-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
400+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
402401
.expect("Execution failed");
403402

404403
assert_eq!(errs, []);

src/executor_tests/variables.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::collections::HashMap;
22

33
use value::Value;
44
use ast::InputValue;
5+
use executor::Variables;
56
use schema::model::RootNode;
67
use ::GraphQLError::ValidationError;
78
use validation::RuleError;
@@ -86,7 +87,7 @@ graphql_object!(TestType: () |&self| {
8687
}
8788
});
8889

89-
fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
90+
fn run_variable_query<F>(query: &str, vars: Variables, f: F)
9091
where F: Fn(&HashMap<String, Value>) -> ()
9192
{
9293
let schema = RootNode::new(TestType, EmptyMutation::<()>::new());
@@ -106,7 +107,7 @@ fn run_variable_query<F>(query: &str, vars: HashMap<String, InputValue>, f: F)
106107
fn run_query<F>(query: &str, f: F)
107108
where F: Fn(&HashMap<String, Value>) -> ()
108109
{
109-
run_variable_query(query, HashMap::new(), f);
110+
run_variable_query(query, Variables::new(), f);
110111
}
111112

112113
#[test]

src/integrations/iron_handlers.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use iron::mime::Mime;
66
use iron::status;
77
use iron::method;
88

9-
use std::collections::{HashMap, BTreeMap};
9+
use std::collections::BTreeMap;
1010

1111
use rustc_serialize::json::{ToJson, Json};
1212

13-
use ::{InputValue, GraphQLType, RootNode, execute};
13+
use ::{InputValue, GraphQLType, RootNode, Variables, execute};
1414

1515
/// Handler that executes GraphQL queries in the given schema
1616
///
@@ -62,7 +62,7 @@ impl<'a, CtxFactory, Query, Mutation, CtxT>
6262
let url = req.url.clone().into_generic_url();
6363

6464
let mut query = None;
65-
let variables = HashMap::new();
65+
let variables = Variables::new();
6666

6767
for (k, v) in url.query_pairs() {
6868
if k == "query" {
@@ -84,17 +84,16 @@ impl<'a, CtxFactory, Query, Mutation, CtxT>
8484
};
8585

8686
let mut query = None;
87-
let mut variables = HashMap::new();
87+
let mut variables = Variables::new();
8888

8989
for (k, v) in json_obj.into_iter() {
9090
if k == "query" {
9191
query = v.as_string().map(|s| s.to_owned());
9292
}
9393
else if k == "variables" {
94-
variables = match InputValue::from_json(v).to_object_value() {
95-
Some(o) => o.into_iter().map(|(k, v)| (k.to_owned(), v.clone())).collect(),
96-
_ => HashMap::new(),
97-
};
94+
variables = InputValue::from_json(v).to_object_value()
95+
.map(|o| o.into_iter().map(|(k, v)| (k.to_owned(), v.clone())).collect())
96+
.unwrap_or_default();
9897
}
9998
}
10099

@@ -103,7 +102,7 @@ impl<'a, CtxFactory, Query, Mutation, CtxT>
103102
self.execute(req, &query, &variables)
104103
}
105104

106-
fn execute(&self, req: &mut Request, query: &str, variables: &HashMap<String, InputValue>) -> IronResult<Response> {
105+
fn execute(&self, req: &mut Request, query: &str, variables: &Variables) -> IronResult<Response> {
107106
let context = (self.context_factory)(req);
108107
let result = execute(query, None, &self.root_node, variables, &context);
109108

src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,6 @@ mod integrations;
209209

210210
#[cfg(test)] mod executor_tests;
211211

212-
use std::collections::HashMap;
213-
214212
use parser::{parse_document_source, ParseError, Spanning};
215213
use validation::{ValidatorContext, visit_all_rules, validate_input_values};
216214
use executor::execute_validated_query;
@@ -219,8 +217,9 @@ pub use ast::{ToInputValue, FromInputValue, InputValue, Type, Selection};
219217
pub use value::Value;
220218
pub use types::base::{Arguments, GraphQLType, TypeKind};
221219
pub use executor::{
222-
Context, FromContext,
223-
Executor, Registry, ExecutionResult, ExecutionError, FieldResult, IntoResolvable,
220+
Executor, ExecutionError, Registry,
221+
Context, FromContext, IntoResolvable,
222+
FieldResult, ExecutionResult, Variables,
224223
};
225224
pub use validation::RuleError;
226225
pub use types::scalars::{EmptyMutation, ID};
@@ -247,7 +246,7 @@ pub fn execute<'a, CtxT, QueryT, MutationT>(
247246
document_source: &'a str,
248247
operation_name: Option<&str>,
249248
root_node: &RootNode<QueryT, MutationT>,
250-
variables: &HashMap<String, InputValue>,
249+
variables: &Variables,
251250
context: &CtxT,
252251
)
253252
-> Result<(Value, Vec<ExecutionError>), GraphQLError<'a>>

src/macros/tests/args.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::collections::HashMap;
22

3+
use executor::Variables;
34
use value::Value;
45
use schema::model::RootNode;
56
use types::scalars::EmptyMutation;
@@ -90,7 +91,7 @@ fn run_args_info_query<F>(field_name: &str, f: F)
9091
"#;
9192
let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
9293

93-
let (result, errs) = ::execute(doc, None, &schema, &HashMap::new(), &())
94+
let (result, errs) = ::execute(doc, None, &schema, &Variables::new(), &())
9495
.expect("Execution failed");
9596

9697
assert_eq!(errs, []);

0 commit comments

Comments
 (0)