Skip to content

Commit a227b09

Browse files
authored
Merge pull request #340 from wravery/issues-334
fix: #334
2 parents 681b0e1 + 81abdc6 commit a227b09

File tree

6 files changed

+66
-8
lines changed

6 files changed

+66
-8
lines changed

samples/learn/schema/StarWarsSchema.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,16 @@ service::AwaitableResolver Result<learn::Episode>::convert(service::AwaitableSca
5353
return ModifiedResult<learn::Episode>::resolve(std::move(result), std::move(params),
5454
[](learn::Episode value, const ResolverParams&)
5555
{
56+
const auto idx = static_cast<size_t>(value);
57+
58+
if (idx >= s_namesEpisode.size())
59+
{
60+
throw service::schema_exception { { R"ex(Enum value out of range for Episode)ex" } };
61+
}
62+
5663
response::Value resolvedResult(response::Type::EnumValue);
5764

58-
resolvedResult.set<std::string>(std::string { s_namesEpisode[static_cast<size_t>(value)] });
65+
resolvedResult.set<std::string>(std::string { s_namesEpisode[idx] });
5966

6067
return resolvedResult;
6168
});

samples/today/nointrospection/TodaySchema.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,16 @@ service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableS
5454
return ModifiedResult<today::TaskState>::resolve(std::move(result), std::move(params),
5555
[](today::TaskState value, const ResolverParams&)
5656
{
57+
const auto idx = static_cast<size_t>(value);
58+
59+
if (idx >= s_namesTaskState.size())
60+
{
61+
throw service::schema_exception { { R"ex(Enum value out of range for TaskState)ex" } };
62+
}
63+
5764
response::Value resolvedResult(response::Type::EnumValue);
5865

59-
resolvedResult.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
66+
resolvedResult.set<std::string>(std::string { s_namesTaskState[idx] });
6067

6168
return resolvedResult;
6269
});

samples/today/schema/TodaySchema.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,16 @@ service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableS
5454
return ModifiedResult<today::TaskState>::resolve(std::move(result), std::move(params),
5555
[](today::TaskState value, const ResolverParams&)
5656
{
57+
const auto idx = static_cast<size_t>(value);
58+
59+
if (idx >= s_namesTaskState.size())
60+
{
61+
throw service::schema_exception { { R"ex(Enum value out of range for TaskState)ex" } };
62+
}
63+
5764
response::Value resolvedResult(response::Type::EnumValue);
5865

59-
resolvedResult.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
66+
resolvedResult.set<std::string>(std::string { s_namesTaskState[idx] });
6067

6168
return resolvedResult;
6269
});

samples/validation/schema/ValidationSchema.cpp

+16-2
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,16 @@ service::AwaitableResolver Result<validation::DogCommand>::convert(service::Awai
5454
return ModifiedResult<validation::DogCommand>::resolve(std::move(result), std::move(params),
5555
[](validation::DogCommand value, const ResolverParams&)
5656
{
57+
const auto idx = static_cast<size_t>(value);
58+
59+
if (idx >= s_namesDogCommand.size())
60+
{
61+
throw service::schema_exception { { R"ex(Enum value out of range for DogCommand)ex" } };
62+
}
63+
5764
response::Value resolvedResult(response::Type::EnumValue);
5865

59-
resolvedResult.set<std::string>(std::string { s_namesDogCommand[static_cast<size_t>(value)] });
66+
resolvedResult.set<std::string>(std::string { s_namesDogCommand[idx] });
6067

6168
return resolvedResult;
6269
});
@@ -110,9 +117,16 @@ service::AwaitableResolver Result<validation::CatCommand>::convert(service::Awai
110117
return ModifiedResult<validation::CatCommand>::resolve(std::move(result), std::move(params),
111118
[](validation::CatCommand value, const ResolverParams&)
112119
{
120+
const auto idx = static_cast<size_t>(value);
121+
122+
if (idx >= s_namesCatCommand.size())
123+
{
124+
throw service::schema_exception { { R"ex(Enum value out of range for CatCommand)ex" } };
125+
}
126+
113127
response::Value resolvedResult(response::Type::EnumValue);
114128

115-
resolvedResult.set<std::string>(std::string { s_namesCatCommand[static_cast<size_t>(value)] });
129+
resolvedResult.set<std::string>(std::string { s_namesCatCommand[idx] });
116130

117131
return resolvedResult;
118132
});

src/SchemaGenerator.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -1336,10 +1336,19 @@ service::AwaitableResolver Result<)cpp"
13361336
[]()cpp" << _loader.getSchemaNamespace()
13371337
<< R"cpp(::)cpp" << enumType.cppType << R"cpp( value, const ResolverParams&)
13381338
{
1339+
const auto idx = static_cast<size_t>(value);
1340+
1341+
if (idx >= s_names)cpp"
1342+
<< enumType.cppType << R"cpp(.size())
1343+
{
1344+
throw service::schema_exception { { R"ex(Enum value out of range for )cpp"
1345+
<< enumType.type << R"cpp()ex" } };
1346+
}
1347+
13391348
response::Value resolvedResult(response::Type::EnumValue);
13401349
13411350
resolvedResult.set<std::string>(std::string { s_names)cpp"
1342-
<< enumType.cppType << R"cpp([static_cast<size_t>(value)] });
1351+
<< enumType.cppType << R"cpp([idx] });
13431352
13441353
return resolvedResult;
13451354
});

src/introspection/IntrospectionSchema.cpp

+16-2
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,16 @@ service::AwaitableResolver Result<introspection::TypeKind>::convert(service::Awa
4848
return ModifiedResult<introspection::TypeKind>::resolve(std::move(result), std::move(params),
4949
[](introspection::TypeKind value, const ResolverParams&)
5050
{
51+
const auto idx = static_cast<size_t>(value);
52+
53+
if (idx >= s_namesTypeKind.size())
54+
{
55+
throw service::schema_exception { { R"ex(Enum value out of range for __TypeKind)ex" } };
56+
}
57+
5158
response::Value resolvedResult(response::Type::EnumValue);
5259

53-
resolvedResult.set<std::string>(std::string { s_namesTypeKind[static_cast<size_t>(value)] });
60+
resolvedResult.set<std::string>(std::string { s_namesTypeKind[idx] });
5461

5562
return resolvedResult;
5663
});
@@ -104,9 +111,16 @@ service::AwaitableResolver Result<introspection::DirectiveLocation>::convert(ser
104111
return ModifiedResult<introspection::DirectiveLocation>::resolve(std::move(result), std::move(params),
105112
[](introspection::DirectiveLocation value, const ResolverParams&)
106113
{
114+
const auto idx = static_cast<size_t>(value);
115+
116+
if (idx >= s_namesDirectiveLocation.size())
117+
{
118+
throw service::schema_exception { { R"ex(Enum value out of range for __DirectiveLocation)ex" } };
119+
}
120+
107121
response::Value resolvedResult(response::Type::EnumValue);
108122

109-
resolvedResult.set<std::string>(std::string { s_namesDirectiveLocation[static_cast<size_t>(value)] });
123+
resolvedResult.set<std::string>(std::string { s_namesDirectiveLocation[idx] });
110124

111125
return resolvedResult;
112126
});

0 commit comments

Comments
 (0)