Skip to content

Commit 1e7de3f

Browse files
committed
Finish executable directive support
1 parent 121b56f commit 1e7de3f

File tree

11 files changed

+564
-239
lines changed

11 files changed

+564
-239
lines changed

GraphQLService.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -630,9 +630,9 @@ class SelectionVisitor
630630
void visitInlineFragment(const peg::ast_node& inlineFragment);
631631

632632
const std::shared_ptr<RequestState>& _state;
633+
const response::Value& _operationDirectives;
633634
const FragmentMap& _fragments;
634635
const response::Value& _variables;
635-
const response::Value& _operationDirectives;
636636
const TypeNames& _typeNames;
637637
const ResolverMap& _resolvers;
638638

@@ -643,9 +643,9 @@ class SelectionVisitor
643643
SelectionVisitor::SelectionVisitor(const SelectionSetParams& selectionSetParams, const FragmentMap& fragments, const response::Value& variables,
644644
const TypeNames& typeNames, const ResolverMap& resolvers)
645645
: _state(selectionSetParams.state)
646+
, _operationDirectives(selectionSetParams.operationDirectives)
646647
, _fragments(fragments)
647648
, _variables(variables)
648-
, _operationDirectives(selectionSetParams.operationDirectives)
649649
, _typeNames(typeNames)
650650
, _resolvers(resolvers)
651651
{
@@ -730,18 +730,18 @@ void SelectionVisitor::visitField(const peg::ast_node& field)
730730

731731
bool skip = false;
732732

733-
response::Value directives(response::Type::Map);
733+
response::Value fieldDirectives(response::Type::Map);
734734

735735
peg::on_first_child<peg::directives>(field,
736-
[this, &directives](const peg::ast_node& child)
736+
[this, &fieldDirectives](const peg::ast_node& child)
737737
{
738738
DirectiveVisitor directiveVisitor(_variables);
739739

740740
directiveVisitor.visit(child);
741-
directives = directiveVisitor.getDirectives();
741+
fieldDirectives = directiveVisitor.getDirectives();
742742
});
743743

744-
if (shouldSkip(directives))
744+
if (shouldSkip(fieldDirectives))
745745
{
746746
return;
747747
}
@@ -779,7 +779,7 @@ void SelectionVisitor::visitField(const peg::ast_node& field)
779779

780780
_values.push({
781781
std::move(alias),
782-
itr->second(ResolverParams(selectionSetParams, std::move(arguments), std::move(directives), selection, _fragments, _variables))
782+
itr->second(ResolverParams(selectionSetParams, std::move(arguments), std::move(fieldDirectives), selection, _fragments, _variables))
783783
});
784784
}
785785

Introspection.cpp

Lines changed: 56 additions & 56 deletions
Large diffs are not rendered by default.

SchemaGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1503,7 +1503,7 @@ std::string Generator::getFieldDeclaration(const OutputField& outputField) const
15031503

15041504
fieldName[0] = std::toupper(fieldName[0]);
15051505
output << R"cpp( virtual std::future<)cpp" << getOutputCppType(outputField)
1506-
<< R"cpp(> get)cpp" << fieldName << R"cpp((const service::FieldParams& params)cpp";
1506+
<< R"cpp(> get)cpp" << fieldName << R"cpp((service::FieldParams&& params)cpp";
15071507

15081508
for (const auto& argument : outputField.arguments)
15091509
{

Today.cpp

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ std::shared_ptr<Appointment> Query::findAppointment(const service::FieldParams&
6262

6363
for (const auto& appointment : _appointments)
6464
{
65-
auto appointmentId = appointment->getId(params).get();
65+
auto appointmentId = appointment->getId(service::FieldParams(params, response::Value(response::Type::Map))).get();
6666

6767
if (appointmentId == id)
6868
{
@@ -96,7 +96,7 @@ std::shared_ptr<Task> Query::findTask(const service::FieldParams& params, const
9696

9797
for (const auto& task : _tasks)
9898
{
99-
auto taskId = task->getId(params).get();
99+
auto taskId = task->getId(service::FieldParams(params, response::Value(response::Type::Map))).get();
100100

101101
if (taskId == id)
102102
{
@@ -130,7 +130,7 @@ std::shared_ptr<Folder> Query::findUnreadCount(const service::FieldParams& param
130130

131131
for (const auto& folder : _unreadCounts)
132132
{
133-
auto folderId = folder->getId(params).get();
133+
auto folderId = folder->getId(service::FieldParams(params, response::Value(response::Type::Map))).get();
134134

135135
if (folderId == id)
136136
{
@@ -141,7 +141,7 @@ std::shared_ptr<Folder> Query::findUnreadCount(const service::FieldParams& param
141141
return nullptr;
142142
}
143143

144-
std::future<std::shared_ptr<service::Object>> Query::getNode(const service::FieldParams& params, std::vector<uint8_t>&& id) const
144+
std::future<std::shared_ptr<service::Object>> Query::getNode(service::FieldParams&& params, std::vector<uint8_t>&& id) const
145145
{
146146
std::promise<std::shared_ptr<service::Object>> promise;
147147
auto appointment = findAppointment(params, id);
@@ -197,16 +197,15 @@ struct EdgeConstraints
197197
unusedDirectives,
198198
unusedDirectives,
199199
};
200-
const service::FieldParams fieldParams(selectionSetParams, {});
201200

202201
if (after)
203202
{
204203
const auto& encoded = after->get<const response::StringType&>();
205204
auto afterId = service::Base64::fromBase64(encoded.c_str(), encoded.size());
206205
auto itrAfter = std::find_if(itrFirst, itrLast,
207-
[this, &fieldParams, &afterId](const std::shared_ptr<_Object>& entry)
206+
[this, &selectionSetParams, &afterId](const std::shared_ptr<_Object>& entry)
208207
{
209-
return entry->getId(fieldParams).get() == afterId;
208+
return entry->getId(service::FieldParams(selectionSetParams, {})).get() == afterId;
210209
});
211210

212211
if (itrAfter != itrLast)
@@ -220,9 +219,9 @@ struct EdgeConstraints
220219
const auto& encoded = before->get<const response::StringType&>();
221220
auto beforeId = service::Base64::fromBase64(encoded.c_str(), encoded.size());
222221
auto itrBefore = std::find_if(itrFirst, itrLast,
223-
[this, &fieldParams, &beforeId](const std::shared_ptr<_Object>& entry)
222+
[this, &selectionSetParams, &beforeId](const std::shared_ptr<_Object>& entry)
224223
{
225-
return entry->getId(fieldParams).get() == beforeId;
224+
return entry->getId(service::FieldParams(selectionSetParams, {})).get() == beforeId;
226225
});
227226

228227
if (itrBefore != itrLast)
@@ -276,7 +275,7 @@ struct EdgeConstraints
276275
const vec_type& _objects;
277276
};
278277

279-
std::future<std::shared_ptr<object::AppointmentConnection>> Query::getAppointments(const service::FieldParams& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
278+
std::future<std::shared_ptr<object::AppointmentConnection>> Query::getAppointments(service::FieldParams&& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
280279
{
281280
auto spThis = shared_from_this();
282281
auto state = params.state;
@@ -292,7 +291,7 @@ std::future<std::shared_ptr<object::AppointmentConnection>> Query::getAppointmen
292291
}, std::move(first), std::move(after), std::move(last), std::move(before));
293292
}
294293

295-
std::future<std::shared_ptr<object::TaskConnection>> Query::getTasks(const service::FieldParams& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
294+
std::future<std::shared_ptr<object::TaskConnection>> Query::getTasks(service::FieldParams&& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
296295
{
297296
auto spThis = shared_from_this();
298297
auto state = params.state;
@@ -308,7 +307,7 @@ std::future<std::shared_ptr<object::TaskConnection>> Query::getTasks(const servi
308307
}, std::move(first), std::move(after), std::move(last), std::move(before));
309308
}
310309

311-
std::future<std::shared_ptr<object::FolderConnection>> Query::getUnreadCounts(const service::FieldParams& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
310+
std::future<std::shared_ptr<object::FolderConnection>> Query::getUnreadCounts(service::FieldParams&& params, std::unique_ptr<int>&& first, std::unique_ptr<response::Value>&& after, std::unique_ptr<int>&& last, std::unique_ptr<response::Value>&& before) const
312311
{
313312
auto spThis = shared_from_this();
314313
auto state = params.state;
@@ -324,7 +323,7 @@ std::future<std::shared_ptr<object::FolderConnection>> Query::getUnreadCounts(co
324323
}, std::move(first), std::move(after), std::move(last), std::move(before));
325324
}
326325

327-
std::future<std::vector<std::shared_ptr<object::Appointment>>> Query::getAppointmentsById(const service::FieldParams& params, std::vector<std::vector<uint8_t>>&& ids) const
326+
std::future<std::vector<std::shared_ptr<object::Appointment>>> Query::getAppointmentsById(service::FieldParams&& params, std::vector<std::vector<uint8_t>>&& ids) const
328327
{
329328
std::promise<std::vector<std::shared_ptr<object::Appointment>>> promise;
330329
std::vector<std::shared_ptr<object::Appointment>> result(ids.size());
@@ -339,7 +338,7 @@ std::future<std::vector<std::shared_ptr<object::Appointment>>> Query::getAppoint
339338
return promise.get_future();
340339
}
341340

342-
std::future<std::vector<std::shared_ptr<object::Task>>> Query::getTasksById(const service::FieldParams& params, std::vector<std::vector<uint8_t>>&& ids) const
341+
std::future<std::vector<std::shared_ptr<object::Task>>> Query::getTasksById(service::FieldParams&& params, std::vector<std::vector<uint8_t>>&& ids) const
343342
{
344343
std::promise<std::vector<std::shared_ptr<object::Task>>> promise;
345344
std::vector<std::shared_ptr<object::Task>> result(ids.size());
@@ -354,7 +353,7 @@ std::future<std::vector<std::shared_ptr<object::Task>>> Query::getTasksById(cons
354353
return promise.get_future();
355354
}
356355

357-
std::future<std::vector<std::shared_ptr<object::Folder>>> Query::getUnreadCountsById(const service::FieldParams& params, std::vector<std::vector<uint8_t>>&& ids) const
356+
std::future<std::vector<std::shared_ptr<object::Folder>>> Query::getUnreadCountsById(service::FieldParams&& params, std::vector<std::vector<uint8_t>>&& ids) const
358357
{
359358
std::promise<std::vector<std::shared_ptr<object::Folder>>> promise;
360359
std::vector<std::shared_ptr<object::Folder>> result(ids.size());
@@ -369,12 +368,21 @@ std::future<std::vector<std::shared_ptr<object::Folder>>> Query::getUnreadCounts
369368
return promise.get_future();
370369
}
371370

371+
std::future<std::shared_ptr<object::NestedType>> Query::getNested(service::FieldParams&& params) const
372+
{
373+
std::promise<std::shared_ptr<object::NestedType>> promise;
374+
375+
promise.set_value(std::make_shared<NestedType>(std::move(params), 1));
376+
377+
return promise.get_future();
378+
}
379+
372380
Mutation::Mutation(completeTaskMutation&& mutateCompleteTask)
373381
: _mutateCompleteTask(std::move(mutateCompleteTask))
374382
{
375383
}
376384

377-
std::future<std::shared_ptr<object::CompleteTaskPayload>> Mutation::getCompleteTask(const service::FieldParams& params, CompleteTaskInput&& input) const
385+
std::future<std::shared_ptr<object::CompleteTaskPayload>> Mutation::getCompleteTask(service::FieldParams&& params, CompleteTaskInput&& input) const
378386
{
379387
std::promise<std::shared_ptr<object::CompleteTaskPayload>> promise;
380388

@@ -383,6 +391,45 @@ std::future<std::shared_ptr<object::CompleteTaskPayload>> Mutation::getCompleteT
383391
return promise.get_future();
384392
}
385393

394+
std::stack<CapturedParams> NestedType::_capturedParams;
395+
396+
NestedType::NestedType(service::FieldParams&& params, int depth)
397+
: depth(depth)
398+
{
399+
_capturedParams.push({
400+
response::Value(params.operationDirectives),
401+
response::Value(params.fragmentDefinitionDirectives),
402+
response::Value(params.fragmentSpreadDirectives),
403+
response::Value(params.inlineFragmentDirectives),
404+
std::move(params.fieldDirectives)
405+
});
406+
}
407+
408+
std::future<response::IntType> NestedType::getDepth(service::FieldParams&& params) const
409+
{
410+
std::promise<response::IntType> promise;
411+
412+
promise.set_value(depth);
413+
414+
return promise.get_future();
415+
}
416+
417+
std::future<std::shared_ptr<object::NestedType>> NestedType::getNested(service::FieldParams&& params) const
418+
{
419+
std::promise<std::shared_ptr<object::NestedType>> promise;
420+
421+
promise.set_value(std::make_shared<NestedType>(std::move(params), depth + 1));
422+
423+
return promise.get_future();
424+
}
425+
426+
std::stack<CapturedParams> NestedType::getCapturedParams()
427+
{
428+
auto result = std::move(_capturedParams);
429+
430+
return result;
431+
}
432+
386433
} /* namespace today */
387434
} /* namespace graphql */
388435
} /* namespace facebook */

0 commit comments

Comments
 (0)