Skip to content

Commit 5e7ff31

Browse files
committed
Separate Argument and ModifiedArgument for ODR
1 parent c5d0a4f commit 5e7ff31

File tree

11 files changed

+75
-67
lines changed

11 files changed

+75
-67
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,33 @@ enum class [[nodiscard]] TypeModifier {
592592
List,
593593
};
594594

595+
template <typename Type>
596+
struct Argument
597+
{
598+
// Convert a single value to the specified type.
599+
[[nodiscard]] static Type convert(const response::Value& value);
600+
};
601+
602+
#ifdef GRAPHQL_DLLEXPORTS
603+
// Export all of the built-in converters
604+
template <>
605+
GRAPHQLSERVICE_EXPORT int Argument<int>::convert(const response::Value& value);
606+
template <>
607+
GRAPHQLSERVICE_EXPORT double Argument<double>::convert(const response::Value& value);
608+
template <>
609+
GRAPHQLSERVICE_EXPORT std::string Argument<std::string>::convert(const response::Value& value);
610+
template <>
611+
GRAPHQLSERVICE_EXPORT bool Argument<bool>::convert(const response::Value& value);
612+
template <>
613+
GRAPHQLSERVICE_EXPORT response::IdType Argument<response::IdType>::convert(
614+
const response::Value& value);
615+
template <>
616+
GRAPHQLSERVICE_EXPORT response::Value Argument<response::Value>::convert(
617+
const response::Value& value);
618+
#endif // GRAPHQL_DLLEXPORTS
619+
620+
namespace {
621+
595622
// Test if there are any non-None modifiers left.
596623
template <TypeModifier... Other>
597624
concept OnlyNoneModifiers = (... && (Other == TypeModifier::None));
@@ -642,16 +669,13 @@ struct ModifiedArgument
642669
using type = U;
643670
};
644671

645-
// Convert a single value to the specified type.
646-
[[nodiscard]] static Type convert(const response::Value& value);
647-
648672
// Call convert on this type without any modifiers.
649673
[[nodiscard]] static inline Type require(
650674
std::string_view name, const response::Value& arguments)
651675
{
652676
try
653677
{
654-
return convert(arguments[name]);
678+
return Argument<Type>::convert(arguments[name]);
655679
}
656680
catch (schema_exception& ex)
657681
{
@@ -816,24 +840,7 @@ using BooleanArgument = ModifiedArgument<bool>;
816840
using IdArgument = ModifiedArgument<response::IdType>;
817841
using ScalarArgument = ModifiedArgument<response::Value>;
818842

819-
#ifdef GRAPHQL_DLLEXPORTS
820-
// Export all of the built-in converters
821-
template <>
822-
GRAPHQLSERVICE_EXPORT int ModifiedArgument<int>::convert(const response::Value& value);
823-
template <>
824-
GRAPHQLSERVICE_EXPORT double ModifiedArgument<double>::convert(const response::Value& value);
825-
template <>
826-
GRAPHQLSERVICE_EXPORT std::string ModifiedArgument<std::string>::convert(
827-
const response::Value& value);
828-
template <>
829-
GRAPHQLSERVICE_EXPORT bool ModifiedArgument<bool>::convert(const response::Value& value);
830-
template <>
831-
GRAPHQLSERVICE_EXPORT response::IdType ModifiedArgument<response::IdType>::convert(
832-
const response::Value& value);
833-
template <>
834-
GRAPHQLSERVICE_EXPORT response::Value ModifiedArgument<response::Value>::convert(
835-
const response::Value& value);
836-
#endif // GRAPHQL_DLLEXPORTS
843+
} // namespace
837844

838845
// Each type should handle fragments with type conditions matching its own
839846
// name and any inheritted interfaces.
@@ -1134,10 +1141,11 @@ struct ModifiedResult
11341141
co_return document;
11351142
}
11361143

1137-
private:
1144+
private
1145+
:
11381146
// Validate a single scalar value is the expected type.
1139-
static void validateScalar(const response::Value& value);
1140-
1147+
static void
1148+
validateScalar(const response::Value& value);
11411149
// Peel off the none modifier. If it's included, it should always be last in the list.
11421150
template <TypeModifier Modifier = TypeModifier::None, TypeModifier... Other>
11431151
static inline void validateScalar(

include/graphqlservice/introspection/IntrospectionSchema.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ namespace service {
177177
#ifdef GRAPHQL_DLLEXPORTS
178178
// Export all of the built-in converters
179179
template <>
180-
GRAPHQLSERVICE_EXPORT introspection::TypeKind ModifiedArgument<introspection::TypeKind>::convert(
180+
GRAPHQLSERVICE_EXPORT introspection::TypeKind Argument<introspection::TypeKind>::convert(
181181
const response::Value& value);
182182
template <>
183183
GRAPHQLSERVICE_EXPORT AwaitableResolver ModifiedResult<introspection::TypeKind>::convert(
@@ -186,7 +186,7 @@ template <>
186186
GRAPHQLSERVICE_EXPORT void ModifiedResult<introspection::TypeKind>::validateScalar(
187187
const response::Value& value);
188188
template <>
189-
GRAPHQLSERVICE_EXPORT introspection::DirectiveLocation ModifiedArgument<introspection::DirectiveLocation>::convert(
189+
GRAPHQLSERVICE_EXPORT introspection::DirectiveLocation Argument<introspection::DirectiveLocation>::convert(
190190
const response::Value& value);
191191
template <>
192192
GRAPHQLSERVICE_EXPORT AwaitableResolver ModifiedResult<introspection::DirectiveLocation>::convert(

samples/learn/schema/StarWarsSchema.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static const auto s_namesEpisode = learn::getEpisodeNames();
2828
static const auto s_valuesEpisode = learn::getEpisodeValues();
2929

3030
template <>
31-
learn::Episode ModifiedArgument<learn::Episode>::convert(const response::Value& value)
31+
learn::Episode Argument<learn::Episode>::convert(const response::Value& value)
3232
{
3333
if (!value.maybe_enum())
3434
{
@@ -81,7 +81,7 @@ void ModifiedResult<learn::Episode>::validateScalar(const response::Value& value
8181
}
8282

8383
template <>
84-
learn::ReviewInput ModifiedArgument<learn::ReviewInput>::convert(const response::Value& value)
84+
learn::ReviewInput Argument<learn::ReviewInput>::convert(const response::Value& value)
8585
{
8686
auto valueStars = service::ModifiedArgument<int>::require("stars", value);
8787
auto valueCommentary = service::ModifiedArgument<std::string>::require<service::TypeModifier::Nullable>("commentary", value);

samples/today/nointrospection/TodaySchema.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static const auto s_namesTaskState = today::getTaskStateNames();
2929
static const auto s_valuesTaskState = today::getTaskStateValues();
3030

3131
template <>
32-
today::TaskState ModifiedArgument<today::TaskState>::convert(const response::Value& value)
32+
today::TaskState Argument<today::TaskState>::convert(const response::Value& value)
3333
{
3434
if (!value.maybe_enum())
3535
{
@@ -82,7 +82,7 @@ void ModifiedResult<today::TaskState>::validateScalar(const response::Value& val
8282
}
8383

8484
template <>
85-
today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(const response::Value& value)
85+
today::CompleteTaskInput Argument<today::CompleteTaskInput>::convert(const response::Value& value)
8686
{
8787
const auto defaultValue = []()
8888
{
@@ -112,7 +112,7 @@ today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(con
112112
}
113113

114114
template <>
115-
today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const response::Value& value)
115+
today::ThirdNestedInput Argument<today::ThirdNestedInput>::convert(const response::Value& value)
116116
{
117117
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
118118
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require<service::TypeModifier::Nullable>("second", value);
@@ -124,7 +124,7 @@ today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const
124124
}
125125

126126
template <>
127-
today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(const response::Value& value)
127+
today::FourthNestedInput Argument<today::FourthNestedInput>::convert(const response::Value& value)
128128
{
129129
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
130130

@@ -134,7 +134,7 @@ today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(con
134134
}
135135

136136
template <>
137-
today::IncludeNullableSelfInput ModifiedArgument<today::IncludeNullableSelfInput>::convert(const response::Value& value)
137+
today::IncludeNullableSelfInput Argument<today::IncludeNullableSelfInput>::convert(const response::Value& value)
138138
{
139139
auto valueSelf = service::ModifiedArgument<today::IncludeNullableSelfInput>::require<service::TypeModifier::Nullable>("self", value);
140140

@@ -144,7 +144,7 @@ today::IncludeNullableSelfInput ModifiedArgument<today::IncludeNullableSelfInput
144144
}
145145

146146
template <>
147-
today::IncludeNonNullableListSelfInput ModifiedArgument<today::IncludeNonNullableListSelfInput>::convert(const response::Value& value)
147+
today::IncludeNonNullableListSelfInput Argument<today::IncludeNonNullableListSelfInput>::convert(const response::Value& value)
148148
{
149149
auto valueSelves = service::ModifiedArgument<today::IncludeNonNullableListSelfInput>::require<service::TypeModifier::List>("selves", value);
150150

@@ -154,7 +154,7 @@ today::IncludeNonNullableListSelfInput ModifiedArgument<today::IncludeNonNullabl
154154
}
155155

156156
template <>
157-
today::StringOperationFilterInput ModifiedArgument<today::StringOperationFilterInput>::convert(const response::Value& value)
157+
today::StringOperationFilterInput Argument<today::StringOperationFilterInput>::convert(const response::Value& value)
158158
{
159159
auto valueAnd_ = service::ModifiedArgument<today::StringOperationFilterInput>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("and", value);
160160
auto valueOr_ = service::ModifiedArgument<today::StringOperationFilterInput>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("or", value);
@@ -186,7 +186,7 @@ today::StringOperationFilterInput ModifiedArgument<today::StringOperationFilterI
186186
}
187187

188188
template <>
189-
today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(const response::Value& value)
189+
today::SecondNestedInput Argument<today::SecondNestedInput>::convert(const response::Value& value)
190190
{
191191
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
192192
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
@@ -198,7 +198,7 @@ today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(con
198198
}
199199

200200
template <>
201-
today::ForwardDeclaredInput ModifiedArgument<today::ForwardDeclaredInput>::convert(const response::Value& value)
201+
today::ForwardDeclaredInput Argument<today::ForwardDeclaredInput>::convert(const response::Value& value)
202202
{
203203
auto valueNullableSelf = service::ModifiedArgument<today::IncludeNullableSelfInput>::require<service::TypeModifier::Nullable>("nullableSelf", value);
204204
auto valueListSelves = service::ModifiedArgument<today::IncludeNonNullableListSelfInput>::require("listSelves", value);
@@ -210,7 +210,7 @@ today::ForwardDeclaredInput ModifiedArgument<today::ForwardDeclaredInput>::conve
210210
}
211211

212212
template <>
213-
today::FirstNestedInput ModifiedArgument<today::FirstNestedInput>::convert(const response::Value& value)
213+
today::FirstNestedInput Argument<today::FirstNestedInput>::convert(const response::Value& value)
214214
{
215215
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
216216
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require("second", value);

samples/today/schema/TodaySchema.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static const auto s_namesTaskState = today::getTaskStateNames();
2929
static const auto s_valuesTaskState = today::getTaskStateValues();
3030

3131
template <>
32-
today::TaskState ModifiedArgument<today::TaskState>::convert(const response::Value& value)
32+
today::TaskState Argument<today::TaskState>::convert(const response::Value& value)
3333
{
3434
if (!value.maybe_enum())
3535
{
@@ -82,7 +82,7 @@ void ModifiedResult<today::TaskState>::validateScalar(const response::Value& val
8282
}
8383

8484
template <>
85-
today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(const response::Value& value)
85+
today::CompleteTaskInput Argument<today::CompleteTaskInput>::convert(const response::Value& value)
8686
{
8787
const auto defaultValue = []()
8888
{
@@ -112,7 +112,7 @@ today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(con
112112
}
113113

114114
template <>
115-
today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const response::Value& value)
115+
today::ThirdNestedInput Argument<today::ThirdNestedInput>::convert(const response::Value& value)
116116
{
117117
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
118118
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require<service::TypeModifier::Nullable>("second", value);
@@ -124,7 +124,7 @@ today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const
124124
}
125125

126126
template <>
127-
today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(const response::Value& value)
127+
today::FourthNestedInput Argument<today::FourthNestedInput>::convert(const response::Value& value)
128128
{
129129
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
130130

@@ -134,7 +134,7 @@ today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(con
134134
}
135135

136136
template <>
137-
today::IncludeNullableSelfInput ModifiedArgument<today::IncludeNullableSelfInput>::convert(const response::Value& value)
137+
today::IncludeNullableSelfInput Argument<today::IncludeNullableSelfInput>::convert(const response::Value& value)
138138
{
139139
auto valueSelf = service::ModifiedArgument<today::IncludeNullableSelfInput>::require<service::TypeModifier::Nullable>("self", value);
140140

@@ -144,7 +144,7 @@ today::IncludeNullableSelfInput ModifiedArgument<today::IncludeNullableSelfInput
144144
}
145145

146146
template <>
147-
today::IncludeNonNullableListSelfInput ModifiedArgument<today::IncludeNonNullableListSelfInput>::convert(const response::Value& value)
147+
today::IncludeNonNullableListSelfInput Argument<today::IncludeNonNullableListSelfInput>::convert(const response::Value& value)
148148
{
149149
auto valueSelves = service::ModifiedArgument<today::IncludeNonNullableListSelfInput>::require<service::TypeModifier::List>("selves", value);
150150

@@ -154,7 +154,7 @@ today::IncludeNonNullableListSelfInput ModifiedArgument<today::IncludeNonNullabl
154154
}
155155

156156
template <>
157-
today::StringOperationFilterInput ModifiedArgument<today::StringOperationFilterInput>::convert(const response::Value& value)
157+
today::StringOperationFilterInput Argument<today::StringOperationFilterInput>::convert(const response::Value& value)
158158
{
159159
auto valueAnd_ = service::ModifiedArgument<today::StringOperationFilterInput>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("and", value);
160160
auto valueOr_ = service::ModifiedArgument<today::StringOperationFilterInput>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("or", value);
@@ -186,7 +186,7 @@ today::StringOperationFilterInput ModifiedArgument<today::StringOperationFilterI
186186
}
187187

188188
template <>
189-
today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(const response::Value& value)
189+
today::SecondNestedInput Argument<today::SecondNestedInput>::convert(const response::Value& value)
190190
{
191191
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
192192
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
@@ -198,7 +198,7 @@ today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(con
198198
}
199199

200200
template <>
201-
today::ForwardDeclaredInput ModifiedArgument<today::ForwardDeclaredInput>::convert(const response::Value& value)
201+
today::ForwardDeclaredInput Argument<today::ForwardDeclaredInput>::convert(const response::Value& value)
202202
{
203203
auto valueNullableSelf = service::ModifiedArgument<today::IncludeNullableSelfInput>::require<service::TypeModifier::Nullable>("nullableSelf", value);
204204
auto valueListSelves = service::ModifiedArgument<today::IncludeNonNullableListSelfInput>::require("listSelves", value);
@@ -210,7 +210,7 @@ today::ForwardDeclaredInput ModifiedArgument<today::ForwardDeclaredInput>::conve
210210
}
211211

212212
template <>
213-
today::FirstNestedInput ModifiedArgument<today::FirstNestedInput>::convert(const response::Value& value)
213+
today::FirstNestedInput Argument<today::FirstNestedInput>::convert(const response::Value& value)
214214
{
215215
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
216216
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require("second", value);

samples/validation/schema/ValidationSchema.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static const auto s_namesDogCommand = validation::getDogCommandNames();
2929
static const auto s_valuesDogCommand = validation::getDogCommandValues();
3030

3131
template <>
32-
validation::DogCommand ModifiedArgument<validation::DogCommand>::convert(const response::Value& value)
32+
validation::DogCommand Argument<validation::DogCommand>::convert(const response::Value& value)
3333
{
3434
if (!value.maybe_enum())
3535
{
@@ -85,7 +85,7 @@ static const auto s_namesCatCommand = validation::getCatCommandNames();
8585
static const auto s_valuesCatCommand = validation::getCatCommandValues();
8686

8787
template <>
88-
validation::CatCommand ModifiedArgument<validation::CatCommand>::convert(const response::Value& value)
88+
validation::CatCommand Argument<validation::CatCommand>::convert(const response::Value& value)
8989
{
9090
if (!value.maybe_enum())
9191
{
@@ -138,7 +138,7 @@ void ModifiedResult<validation::CatCommand>::validateScalar(const response::Valu
138138
}
139139

140140
template <>
141-
validation::ComplexInput ModifiedArgument<validation::ComplexInput>::convert(const response::Value& value)
141+
validation::ComplexInput Argument<validation::ComplexInput>::convert(const response::Value& value)
142142
{
143143
auto valueName = service::ModifiedArgument<std::string>::require<service::TypeModifier::Nullable>("name", value);
144144
auto valueOwner = service::ModifiedArgument<std::string>::require<service::TypeModifier::Nullable>("owner", value);

src/GraphQLService.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ schema_location ResolverParams::getLocation() const
617617
}
618618

619619
template <>
620-
int ModifiedArgument<int>::convert(const response::Value& value)
620+
int Argument<int>::convert(const response::Value& value)
621621
{
622622
if (value.type() != response::Type::Int)
623623
{
@@ -628,7 +628,7 @@ int ModifiedArgument<int>::convert(const response::Value& value)
628628
}
629629

630630
template <>
631-
double ModifiedArgument<double>::convert(const response::Value& value)
631+
double Argument<double>::convert(const response::Value& value)
632632
{
633633
if (value.type() != response::Type::Float && value.type() != response::Type::Int)
634634
{
@@ -639,7 +639,7 @@ double ModifiedArgument<double>::convert(const response::Value& value)
639639
}
640640

641641
template <>
642-
std::string ModifiedArgument<std::string>::convert(const response::Value& value)
642+
std::string Argument<std::string>::convert(const response::Value& value)
643643
{
644644
if (value.type() != response::Type::String)
645645
{
@@ -650,7 +650,7 @@ std::string ModifiedArgument<std::string>::convert(const response::Value& value)
650650
}
651651

652652
template <>
653-
bool ModifiedArgument<bool>::convert(const response::Value& value)
653+
bool Argument<bool>::convert(const response::Value& value)
654654
{
655655
if (value.type() != response::Type::Boolean)
656656
{
@@ -661,13 +661,13 @@ bool ModifiedArgument<bool>::convert(const response::Value& value)
661661
}
662662

663663
template <>
664-
response::Value ModifiedArgument<response::Value>::convert(const response::Value& value)
664+
response::Value Argument<response::Value>::convert(const response::Value& value)
665665
{
666666
return response::Value(value);
667667
}
668668

669669
template <>
670-
response::IdType ModifiedArgument<response::IdType>::convert(const response::Value& value)
670+
response::IdType Argument<response::IdType>::convert(const response::Value& value)
671671
{
672672
if (!value.maybe_id())
673673
{

src/RequestLoader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ void RequestLoader::addTypesToSchema()
572572

573573
locationValue.set<std::string>(std::string { locationName });
574574

575-
return service::ModifiedArgument<introspection::DirectiveLocation>::convert(
575+
return service::Argument<introspection::DirectiveLocation>::convert(
576576
locationValue);
577577
});
578578

0 commit comments

Comments
 (0)