2017-07-04 19:27:47 +00:00
|
|
|
import 'package:graphql_parser/graphql_parser.dart';
|
|
|
|
import 'package:graphql_parser/visitor.dart';
|
|
|
|
|
|
|
|
const String QUERY = '''
|
|
|
|
{
|
|
|
|
foo,
|
|
|
|
baz: bar
|
|
|
|
}
|
|
|
|
''';
|
|
|
|
|
|
|
|
const Map<String, dynamic> DATA = const {
|
|
|
|
'foo': 'hello',
|
|
|
|
'bar': 'world',
|
|
|
|
'quux': 'extraneous'
|
|
|
|
};
|
|
|
|
|
|
|
|
main() {
|
|
|
|
// Highly-simplified querying example...
|
|
|
|
var result = new MapQuerier(DATA).execute(QUERY);
|
|
|
|
print(result); // { foo: hello, baz: world }
|
|
|
|
print(result['foo']); // hello
|
|
|
|
print(result['baz']); // world
|
|
|
|
}
|
|
|
|
|
|
|
|
class MapQuerier extends GraphQLVisitor {
|
|
|
|
final Map<String, dynamic> data;
|
|
|
|
final Map<String, dynamic> result = {};
|
|
|
|
|
|
|
|
MapQuerier(this.data);
|
|
|
|
|
|
|
|
Map<String, dynamic> execute(String query) {
|
|
|
|
var doc = new Parser(scan(query)).parseDocument();
|
|
|
|
visitDocument(doc);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
visitField(FieldContext ctx) {
|
|
|
|
String realName, alias;
|
|
|
|
if (ctx.fieldName.alias == null)
|
|
|
|
realName = alias = ctx.fieldName.name;
|
|
|
|
else {
|
|
|
|
realName = ctx.fieldName.alias.name;
|
|
|
|
alias = ctx.fieldName.alias.alias;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set output field...
|
|
|
|
result[alias] = data[realName];
|
|
|
|
}
|
2018-08-04 19:18:53 +00:00
|
|
|
}
|