Skip to content

Commit 29ccf43

Browse files
committed
fix: handle potential modifiers on bool lists
1 parent dce7c1f commit 29ccf43

File tree

8 files changed

+53
-30
lines changed

8 files changed

+53
-30
lines changed

include/graphqlservice/GraphQLClient.h

+16-14
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,19 @@ struct ModifiedVariable
168168
response::Value result { response::Type::List };
169169

170170
result.reserve(listValue.size());
171-
if constexpr(std::is_same_v<Type,bool>){
172-
for (auto const v: listValue)
173-
result.emplace_back(Variable<bool>::serialize(bool{v}));
171+
if constexpr (std::is_same_v<Type, bool> && OnlyNoneModifiers<Other...>)
172+
{
173+
std::ranges::for_each(listValue, [&result](bool value) {
174+
result.emplace_back(response::Value { value });
175+
});
174176
}
175-
else{
177+
else
178+
{
176179
std::ranges::for_each(listValue, [&result](auto& value) {
177180
result.emplace_back(serialize<Other...>(std::move(value)));
178-
});
181+
});
179182
}
180-
183+
181184
listValue.clear();
182185

183186
return result;
@@ -224,19 +227,18 @@ struct ModifiedVariable
224227
duplicate(const typename VariableTraits<Type, Modifier, Other...>::type& listValue)
225228
requires ListModifier<Modifier>
226229
{
227-
if constexpr(std::is_same_v<Type,bool>){
228-
typename VariableTraits<Type, Modifier, Other...>::type result;
229-
result.reserve(listValue.size());
230-
for (auto const v: listValue)
231-
result.push_back(v);
232-
return result;
230+
typename VariableTraits<Type, Modifier, Other...>::type result(listValue.size());
231+
232+
if constexpr (std::is_same_v<Type, bool> && OnlyNoneModifiers<Other...>)
233+
{
234+
std::copy(listValue.begin(), listValue.end(), result.begin());
233235
}
234236
else
235237
{
236-
typename VariableTraits<Type, Modifier, Other...>::type result(listValue.size());
237238
std::ranges::transform(listValue, result.begin(), duplicate<Other...>);
238-
return result;
239239
}
240+
241+
return result;
240242
}
241243
};
242244

include/graphqlservice/GraphQLService.h

+7-8
Original file line numberDiff line numberDiff line change
@@ -795,19 +795,18 @@ struct ModifiedArgument
795795
duplicate(const typename ArgumentTraits<Type, Modifier, Other...>::type& listValue)
796796
requires ListModifier<Modifier>
797797
{
798-
if constexpr(std::is_same_v<Type,bool>){
799-
typename ArgumentTraits<Type, Modifier, Other...>::type result;
800-
result.reserve(listValue.size());
801-
for (auto const v: listValue)
802-
result.push_back(v);
803-
return result;
798+
typename ArgumentTraits<Type, Modifier, Other...>::type result(listValue.size());
799+
800+
if constexpr (std::is_same_v<Type, bool> && OnlyNoneModifiers<Other...>)
801+
{
802+
std::copy(listValue.begin(), listValue.end(), result.begin());
804803
}
805804
else
806805
{
807-
typename ArgumentTraits<Type, Modifier, Other...>::type result(listValue.size());
808806
std::ranges::transform(listValue, result.begin(), duplicate<Other...>);
809-
return result;
810807
}
808+
809+
return result;
811810
}
812811
};
813812

samples/today/nointrospection/TodaySchema.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
109109
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)), R"gql()gql"sv),
110110
schema::InputValue::Make(R"gql(testTaskState)gql"sv, R"md()md"sv, schema->LookupType(R"gql(TaskState)gql"sv), R"gql()gql"sv),
111111
schema::InputValue::Make(R"gql(isComplete)gql"sv, R"md()md"sv, schema->LookupType(R"gql(Boolean)gql"sv), R"gql(true)gql"sv),
112-
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType(R"gql(String)gql"sv), R"gql()gql"sv)
112+
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType(R"gql(String)gql"sv), R"gql()gql"sv),
113+
schema::InputValue::Make(R"gql(boolList)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::LIST, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(Boolean)gql"sv))), R"gql()gql"sv)
113114
});
114115
typeThirdNestedInput->AddInputValues({
115116
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)), R"gql()gql"sv),

samples/today/nointrospection/TodaySharedTypes.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,14 @@ today::CompleteTaskInput Argument<today::CompleteTaskInput>::convert(const respo
101101
? std::move(pairIsComplete.first)
102102
: service::ModifiedArgument<bool>::require<service::TypeModifier::Nullable>("isComplete", defaultValue));
103103
auto valueClientMutationId = service::ModifiedArgument<std::string>::require<service::TypeModifier::Nullable>("clientMutationId", value);
104+
auto valueBoolList = service::ModifiedArgument<bool>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("boolList", value);
104105

105106
return today::CompleteTaskInput {
106107
std::move(valueId),
107108
valueTestTaskState,
108109
std::move(valueIsComplete),
109-
std::move(valueClientMutationId)
110+
std::move(valueClientMutationId),
111+
std::move(valueBoolList)
110112
};
111113
}
112114

@@ -231,6 +233,7 @@ CompleteTaskInput::CompleteTaskInput() noexcept
231233
, testTaskState {}
232234
, isComplete {}
233235
, clientMutationId {}
236+
, boolList {}
234237
{
235238
// Explicit definition to prevent ODR violations when LTO is enabled.
236239
}
@@ -239,11 +242,13 @@ CompleteTaskInput::CompleteTaskInput(
239242
response::IdType idArg,
240243
std::optional<TaskState> testTaskStateArg,
241244
std::optional<bool> isCompleteArg,
242-
std::optional<std::string> clientMutationIdArg) noexcept
245+
std::optional<std::string> clientMutationIdArg,
246+
std::optional<std::vector<bool>> boolListArg) noexcept
243247
: id { std::move(idArg) }
244248
, testTaskState { std::move(testTaskStateArg) }
245249
, isComplete { std::move(isCompleteArg) }
246250
, clientMutationId { std::move(clientMutationIdArg) }
251+
, boolList { std::move(boolListArg) }
247252
{
248253
}
249254

@@ -252,6 +257,7 @@ CompleteTaskInput::CompleteTaskInput(const CompleteTaskInput& other)
252257
, testTaskState { service::ModifiedArgument<TaskState>::duplicate<service::TypeModifier::Nullable>(other.testTaskState) }
253258
, isComplete { service::ModifiedArgument<bool>::duplicate<service::TypeModifier::Nullable>(other.isComplete) }
254259
, clientMutationId { service::ModifiedArgument<std::string>::duplicate<service::TypeModifier::Nullable>(other.clientMutationId) }
260+
, boolList { service::ModifiedArgument<bool>::duplicate<service::TypeModifier::Nullable, service::TypeModifier::List>(other.boolList) }
255261
{
256262
}
257263

@@ -260,6 +266,7 @@ CompleteTaskInput::CompleteTaskInput(CompleteTaskInput&& other) noexcept
260266
, testTaskState { std::move(other.testTaskState) }
261267
, isComplete { std::move(other.isComplete) }
262268
, clientMutationId { std::move(other.clientMutationId) }
269+
, boolList { std::move(other.boolList) }
263270
{
264271
}
265272

@@ -283,6 +290,7 @@ CompleteTaskInput& CompleteTaskInput::operator=(CompleteTaskInput&& other) noexc
283290
testTaskState = std::move(other.testTaskState);
284291
isComplete = std::move(other.isComplete);
285292
clientMutationId = std::move(other.clientMutationId);
293+
boolList = std::move(other.boolList);
286294

287295
return *this;
288296
}

samples/today/nointrospection/TodaySharedTypes.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ struct [[nodiscard("unnecessary construction")]] CompleteTaskInput
6565
response::IdType idArg,
6666
std::optional<TaskState> testTaskStateArg,
6767
std::optional<bool> isCompleteArg,
68-
std::optional<std::string> clientMutationIdArg) noexcept;
68+
std::optional<std::string> clientMutationIdArg,
69+
std::optional<std::vector<bool>> boolListArg) noexcept;
6970
CompleteTaskInput(const CompleteTaskInput& other);
7071
CompleteTaskInput(CompleteTaskInput&& other) noexcept;
7172
~CompleteTaskInput();
@@ -77,6 +78,7 @@ struct [[nodiscard("unnecessary construction")]] CompleteTaskInput
7778
std::optional<TaskState> testTaskState;
7879
std::optional<bool> isComplete;
7980
std::optional<std::string> clientMutationId;
81+
std::optional<std::vector<bool>> boolList;
8082
};
8183

8284
struct SecondNestedInput;

samples/today/schema/TodaySchema.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
112112
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)), R"gql()gql"sv),
113113
schema::InputValue::Make(R"gql(testTaskState)gql"sv, R"md()md"sv, schema->LookupType(R"gql(TaskState)gql"sv), R"gql()gql"sv),
114114
schema::InputValue::Make(R"gql(isComplete)gql"sv, R"md()md"sv, schema->LookupType(R"gql(Boolean)gql"sv), R"gql(true)gql"sv),
115-
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType(R"gql(String)gql"sv), R"gql()gql"sv)
115+
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType(R"gql(String)gql"sv), R"gql()gql"sv),
116+
schema::InputValue::Make(R"gql(boolList)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::LIST, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(Boolean)gql"sv))), R"gql()gql"sv)
116117
});
117118
typeThirdNestedInput->AddInputValues({
118119
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)), R"gql()gql"sv),

samples/today/schema/TodaySharedTypes.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,14 @@ today::CompleteTaskInput Argument<today::CompleteTaskInput>::convert(const respo
101101
? std::move(pairIsComplete.first)
102102
: service::ModifiedArgument<bool>::require<service::TypeModifier::Nullable>("isComplete", defaultValue));
103103
auto valueClientMutationId = service::ModifiedArgument<std::string>::require<service::TypeModifier::Nullable>("clientMutationId", value);
104+
auto valueBoolList = service::ModifiedArgument<bool>::require<service::TypeModifier::Nullable, service::TypeModifier::List>("boolList", value);
104105

105106
return today::CompleteTaskInput {
106107
std::move(valueId),
107108
valueTestTaskState,
108109
std::move(valueIsComplete),
109-
std::move(valueClientMutationId)
110+
std::move(valueClientMutationId),
111+
std::move(valueBoolList)
110112
};
111113
}
112114

@@ -231,6 +233,7 @@ CompleteTaskInput::CompleteTaskInput() noexcept
231233
, testTaskState {}
232234
, isComplete {}
233235
, clientMutationId {}
236+
, boolList {}
234237
{
235238
// Explicit definition to prevent ODR violations when LTO is enabled.
236239
}
@@ -239,11 +242,13 @@ CompleteTaskInput::CompleteTaskInput(
239242
response::IdType idArg,
240243
std::optional<TaskState> testTaskStateArg,
241244
std::optional<bool> isCompleteArg,
242-
std::optional<std::string> clientMutationIdArg) noexcept
245+
std::optional<std::string> clientMutationIdArg,
246+
std::optional<std::vector<bool>> boolListArg) noexcept
243247
: id { std::move(idArg) }
244248
, testTaskState { std::move(testTaskStateArg) }
245249
, isComplete { std::move(isCompleteArg) }
246250
, clientMutationId { std::move(clientMutationIdArg) }
251+
, boolList { std::move(boolListArg) }
247252
{
248253
}
249254

@@ -252,6 +257,7 @@ CompleteTaskInput::CompleteTaskInput(const CompleteTaskInput& other)
252257
, testTaskState { service::ModifiedArgument<TaskState>::duplicate<service::TypeModifier::Nullable>(other.testTaskState) }
253258
, isComplete { service::ModifiedArgument<bool>::duplicate<service::TypeModifier::Nullable>(other.isComplete) }
254259
, clientMutationId { service::ModifiedArgument<std::string>::duplicate<service::TypeModifier::Nullable>(other.clientMutationId) }
260+
, boolList { service::ModifiedArgument<bool>::duplicate<service::TypeModifier::Nullable, service::TypeModifier::List>(other.boolList) }
255261
{
256262
}
257263

@@ -260,6 +266,7 @@ CompleteTaskInput::CompleteTaskInput(CompleteTaskInput&& other) noexcept
260266
, testTaskState { std::move(other.testTaskState) }
261267
, isComplete { std::move(other.isComplete) }
262268
, clientMutationId { std::move(other.clientMutationId) }
269+
, boolList { std::move(other.boolList) }
263270
{
264271
}
265272

@@ -283,6 +290,7 @@ CompleteTaskInput& CompleteTaskInput::operator=(CompleteTaskInput&& other) noexc
283290
testTaskState = std::move(other.testTaskState);
284291
isComplete = std::move(other.isComplete);
285292
clientMutationId = std::move(other.clientMutationId);
293+
boolList = std::move(other.boolList);
286294

287295
return *this;
288296
}

samples/today/schema/TodaySharedTypes.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ struct [[nodiscard("unnecessary construction")]] CompleteTaskInput
6565
response::IdType idArg,
6666
std::optional<TaskState> testTaskStateArg,
6767
std::optional<bool> isCompleteArg,
68-
std::optional<std::string> clientMutationIdArg) noexcept;
68+
std::optional<std::string> clientMutationIdArg,
69+
std::optional<std::vector<bool>> boolListArg) noexcept;
6970
CompleteTaskInput(const CompleteTaskInput& other);
7071
CompleteTaskInput(CompleteTaskInput&& other) noexcept;
7172
~CompleteTaskInput();
@@ -77,6 +78,7 @@ struct [[nodiscard("unnecessary construction")]] CompleteTaskInput
7778
std::optional<TaskState> testTaskState;
7879
std::optional<bool> isComplete;
7980
std::optional<std::string> clientMutationId;
81+
std::optional<std::vector<bool>> boolList;
8082
};
8183

8284
struct SecondNestedInput;

0 commit comments

Comments
 (0)