Skip to content

Commit 615f800

Browse files
authored
Merge pull request #168 from wravery/learn-sample
Add a learn_star_wars sample based on https://graphql.org/learn/
2 parents e5c6f03 + 805bd1d commit 615f800

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+2047
-252
lines changed

samples/CMakeLists.txt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,17 @@ if(GRAPHQL_UPDATE_SAMPLES)
7474
WORKING_DIRECTORY separate_nointrospection
7575
COMMENT "Generating mock TodaySchema without Introspection (--no-introspection --separate-files)")
7676

77+
# learn
78+
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/learn)
79+
80+
add_custom_command(
81+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/learn/learn_schema_files
82+
COMMAND schemagen --schema="${CMAKE_CURRENT_SOURCE_DIR}/schema.learn.graphql" --prefix="StarWars" --namespace="learn" --separate-files > learn_schema_files
83+
COMMAND ${CMAKE_COMMAND} -E copy_if_different learn_schema_files ${CMAKE_CURRENT_SOURCE_DIR}/learn
84+
DEPENDS schemagen graphqlpeg schema.learn.graphql
85+
WORKING_DIRECTORY learn
86+
COMMENT "Generating mock StarWarsSchema (--separate-files)")
87+
7788
add_custom_command(
7889
OUTPUT updated_samples
7990
COMMAND ${CMAKE_COMMAND}
@@ -86,10 +97,16 @@ if(GRAPHQL_UPDATE_SAMPLES)
8697
"-DSCHEMA_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/separate_nointrospection"
8798
"-DSCHEMA_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/separate_nointrospection"
8899
-P "${CMAKE_CURRENT_SOURCE_DIR}/update_samples.cmake"
100+
COMMAND ${CMAKE_COMMAND}
101+
"-DSCHEMA_SOURCE_LIST=learn_schema_files"
102+
"-DSCHEMA_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/learn"
103+
"-DSCHEMA_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/learn"
104+
-P "${CMAKE_CURRENT_SOURCE_DIR}/update_samples.cmake"
89105
COMMAND ${CMAKE_COMMAND} -E touch updated_samples
90106
DEPENDS
91107
${CMAKE_CURRENT_BINARY_DIR}/separate/today_schema_files
92108
${CMAKE_CURRENT_BINARY_DIR}/separate_nointrospection/today_schema_files
109+
${CMAKE_CURRENT_BINARY_DIR}/learn/learn_schema_files
93110
COMMENT "Updating sample files")
94111

95112
add_custom_target(update_samples ALL
@@ -214,6 +231,25 @@ if(GRAPHQL_UPDATE_SAMPLES)
214231
add_dependencies(separateschema_nointrospection update_samples)
215232
endif()
216233

234+
# learnschema
235+
set(LEARN_SCHEMA_PATHS "")
236+
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/learn/learn_schema_files LEARN_SCHEMA_FILES)
237+
foreach(CPP_FILE IN LISTS LEARN_SCHEMA_FILES)
238+
list(APPEND LEARN_SCHEMA_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/learn/${CPP_FILE}")
239+
endforeach(CPP_FILE)
240+
241+
add_library(learnschema STATIC ${LEARN_SCHEMA_PATHS})
242+
target_link_libraries(learnschema PUBLIC graphqlintrospection)
243+
target_include_directories(learnschema PUBLIC
244+
${CMAKE_CURRENT_SOURCE_DIR}/../include
245+
${CMAKE_CURRENT_SOURCE_DIR}/../PEGTL/include
246+
${CMAKE_CURRENT_SOURCE_DIR}/learn)
247+
248+
if(GRAPHQL_UPDATE_SAMPLES)
249+
# wait for the sample update to complete
250+
add_dependencies(learnschema update_samples)
251+
endif()
252+
217253
# separategraphql
218254
add_library(separategraphql STATIC today/TodayMock.cpp)
219255
target_link_libraries(separategraphql PUBLIC separateschema)
@@ -224,6 +260,17 @@ add_library(separategraphql_nointrospection STATIC today/TodayMock.cpp)
224260
target_link_libraries(separategraphql_nointrospection PUBLIC separateschema_nointrospection)
225261
target_include_directories(separategraphql_nointrospection PUBLIC today)
226262

263+
# star_wars
264+
add_library(star_wars STATIC
265+
star_wars/DroidData.cpp
266+
star_wars/HumanData.cpp
267+
star_wars/QueryData.cpp
268+
star_wars/ReviewData.cpp
269+
star_wars/MutationData.cpp
270+
star_wars/StarWarsData.cpp)
271+
target_link_libraries(star_wars PUBLIC learnschema)
272+
target_include_directories(star_wars PUBLIC star_wars)
273+
227274
# sample
228275
add_executable(sample today/sample.cpp)
229276
target_link_libraries(sample PRIVATE
@@ -242,6 +289,15 @@ target_include_directories(sample_nointrospection PRIVATE
242289
${CMAKE_CURRENT_SOURCE_DIR}/../include
243290
${CMAKE_CURRENT_SOURCE_DIR}/../PEGTL/include)
244291

292+
# learn_star_wars
293+
add_executable(learn_star_wars star_wars/sample.cpp)
294+
target_link_libraries(learn_star_wars PRIVATE
295+
star_wars
296+
graphqljson)
297+
target_include_directories(learn_star_wars PRIVATE
298+
${CMAKE_CURRENT_SOURCE_DIR}/../include
299+
${CMAKE_CURRENT_SOURCE_DIR}/../PEGTL/include)
300+
245301
if(WIN32 AND BUILD_SHARED_LIBS)
246302
add_custom_command(OUTPUT copied_sample_dlls
247303
COMMAND ${CMAKE_COMMAND} -E copy_if_different

samples/learn/DroidObject.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
// WARNING! Do not edit this file manually, your changes will be overwritten.
5+
6+
#include "StarWarsObjects.h"
7+
8+
#include "graphqlservice/introspection/Introspection.h"
9+
10+
#include <algorithm>
11+
#include <functional>
12+
#include <sstream>
13+
#include <stdexcept>
14+
#include <unordered_map>
15+
16+
using namespace std::literals;
17+
18+
namespace graphql::learn {
19+
namespace object {
20+
21+
Droid::Droid()
22+
: service::Object({
23+
"Character",
24+
"Droid"
25+
}, {
26+
{ R"gql(id)gql"sv, [this](service::ResolverParams&& params) { return resolveId(std::move(params)); } },
27+
{ R"gql(name)gql"sv, [this](service::ResolverParams&& params) { return resolveName(std::move(params)); } },
28+
{ R"gql(friends)gql"sv, [this](service::ResolverParams&& params) { return resolveFriends(std::move(params)); } },
29+
{ R"gql(appearsIn)gql"sv, [this](service::ResolverParams&& params) { return resolveAppearsIn(std::move(params)); } },
30+
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
31+
{ R"gql(primaryFunction)gql"sv, [this](service::ResolverParams&& params) { return resolvePrimaryFunction(std::move(params)); } }
32+
})
33+
{
34+
}
35+
36+
service::FieldResult<response::StringType> Droid::getId(service::FieldParams&&) const
37+
{
38+
throw std::runtime_error(R"ex(Droid::getId is not implemented)ex");
39+
}
40+
41+
std::future<service::ResolverResult> Droid::resolveId(service::ResolverParams&& params)
42+
{
43+
std::unique_lock resolverLock(_resolverMutex);
44+
auto directives = std::move(params.fieldDirectives);
45+
auto result = getId(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
46+
resolverLock.unlock();
47+
48+
return service::ModifiedResult<response::StringType>::convert(std::move(result), std::move(params));
49+
}
50+
51+
service::FieldResult<std::optional<response::StringType>> Droid::getName(service::FieldParams&&) const
52+
{
53+
throw std::runtime_error(R"ex(Droid::getName is not implemented)ex");
54+
}
55+
56+
std::future<service::ResolverResult> Droid::resolveName(service::ResolverParams&& params)
57+
{
58+
std::unique_lock resolverLock(_resolverMutex);
59+
auto directives = std::move(params.fieldDirectives);
60+
auto result = getName(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
61+
resolverLock.unlock();
62+
63+
return service::ModifiedResult<response::StringType>::convert<service::TypeModifier::Nullable>(std::move(result), std::move(params));
64+
}
65+
66+
service::FieldResult<std::optional<std::vector<std::shared_ptr<service::Object>>>> Droid::getFriends(service::FieldParams&&) const
67+
{
68+
throw std::runtime_error(R"ex(Droid::getFriends is not implemented)ex");
69+
}
70+
71+
std::future<service::ResolverResult> Droid::resolveFriends(service::ResolverParams&& params)
72+
{
73+
std::unique_lock resolverLock(_resolverMutex);
74+
auto directives = std::move(params.fieldDirectives);
75+
auto result = getFriends(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
76+
resolverLock.unlock();
77+
78+
return service::ModifiedResult<service::Object>::convert<service::TypeModifier::Nullable, service::TypeModifier::List, service::TypeModifier::Nullable>(std::move(result), std::move(params));
79+
}
80+
81+
service::FieldResult<std::optional<std::vector<std::optional<Episode>>>> Droid::getAppearsIn(service::FieldParams&&) const
82+
{
83+
throw std::runtime_error(R"ex(Droid::getAppearsIn is not implemented)ex");
84+
}
85+
86+
std::future<service::ResolverResult> Droid::resolveAppearsIn(service::ResolverParams&& params)
87+
{
88+
std::unique_lock resolverLock(_resolverMutex);
89+
auto directives = std::move(params.fieldDirectives);
90+
auto result = getAppearsIn(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
91+
resolverLock.unlock();
92+
93+
return service::ModifiedResult<Episode>::convert<service::TypeModifier::Nullable, service::TypeModifier::List, service::TypeModifier::Nullable>(std::move(result), std::move(params));
94+
}
95+
96+
service::FieldResult<std::optional<response::StringType>> Droid::getPrimaryFunction(service::FieldParams&&) const
97+
{
98+
throw std::runtime_error(R"ex(Droid::getPrimaryFunction is not implemented)ex");
99+
}
100+
101+
std::future<service::ResolverResult> Droid::resolvePrimaryFunction(service::ResolverParams&& params)
102+
{
103+
std::unique_lock resolverLock(_resolverMutex);
104+
auto directives = std::move(params.fieldDirectives);
105+
auto result = getPrimaryFunction(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
106+
resolverLock.unlock();
107+
108+
return service::ModifiedResult<response::StringType>::convert<service::TypeModifier::Nullable>(std::move(result), std::move(params));
109+
}
110+
111+
std::future<service::ResolverResult> Droid::resolve_typename(service::ResolverParams&& params)
112+
{
113+
return service::ModifiedResult<response::StringType>::convert(response::StringType{ R"gql(Droid)gql" }, std::move(params));
114+
}
115+
116+
} // namespace object
117+
118+
void AddDroidDetails(std::shared_ptr<schema::ObjectType> typeDroid, const std::shared_ptr<schema::Schema>& schema)
119+
{
120+
typeDroid->AddInterfaces({
121+
std::static_pointer_cast<const schema::InterfaceType>(schema->LookupType(R"gql(Character)gql"sv))
122+
});
123+
typeDroid->AddFields({
124+
schema::Field::Make(R"gql(id)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("String"))),
125+
schema::Field::Make(R"gql(name)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType("String")),
126+
schema::Field::Make(R"gql(friends)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::LIST, schema->LookupType("Character"))),
127+
schema::Field::Make(R"gql(appearsIn)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::LIST, schema->LookupType("Episode"))),
128+
schema::Field::Make(R"gql(primaryFunction)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType("String"))
129+
});
130+
}
131+
132+
} // namespace graphql::learn

samples/learn/DroidObject.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
// WARNING! Do not edit this file manually, your changes will be overwritten.
5+
6+
#pragma once
7+
8+
#ifndef DROIDOBJECT_H
9+
#define DROIDOBJECT_H
10+
11+
#include "StarWarsSchema.h"
12+
13+
namespace graphql::learn::object {
14+
15+
class Droid
16+
: public service::Object
17+
, public Character
18+
{
19+
protected:
20+
explicit Droid();
21+
22+
public:
23+
virtual service::FieldResult<response::StringType> getId(service::FieldParams&& params) const override;
24+
virtual service::FieldResult<std::optional<response::StringType>> getName(service::FieldParams&& params) const override;
25+
virtual service::FieldResult<std::optional<std::vector<std::shared_ptr<service::Object>>>> getFriends(service::FieldParams&& params) const override;
26+
virtual service::FieldResult<std::optional<std::vector<std::optional<Episode>>>> getAppearsIn(service::FieldParams&& params) const override;
27+
virtual service::FieldResult<std::optional<response::StringType>> getPrimaryFunction(service::FieldParams&& params) const;
28+
29+
private:
30+
std::future<service::ResolverResult> resolveId(service::ResolverParams&& params);
31+
std::future<service::ResolverResult> resolveName(service::ResolverParams&& params);
32+
std::future<service::ResolverResult> resolveFriends(service::ResolverParams&& params);
33+
std::future<service::ResolverResult> resolveAppearsIn(service::ResolverParams&& params);
34+
std::future<service::ResolverResult> resolvePrimaryFunction(service::ResolverParams&& params);
35+
36+
std::future<service::ResolverResult> resolve_typename(service::ResolverParams&& params);
37+
};
38+
39+
} // namespace graphql::learn::object
40+
41+
#endif // DROIDOBJECT_H

0 commit comments

Comments
 (0)