Skip to content

Commit 44081d4

Browse files
authored
Merge pull request #164 from wravery/nested-input-types
Reorder input types to fully declare nested types first
2 parents 3a8d2fb + 4de926e commit 44081d4

File tree

11 files changed

+446
-12
lines changed

11 files changed

+446
-12
lines changed

include/SchemaGenerator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ struct InputType
121121
std::string_view cppType;
122122
InputFieldList fields;
123123
std::string_view description;
124+
std::unordered_set<std::string_view> dependencies;
124125
};
125126

126127
using InputTypeList = std::vector<InputType>;
@@ -371,6 +372,7 @@ class Generator
371372
const std::optional<std::unordered_set<std::string_view>>& interfaceFields,
372373
const std::optional<std::string_view>& accessor);
373374
void fixupInputFieldList(InputFieldList& fields);
375+
void reorderInputTypeDependencies();
374376

375377
std::string_view getCppType(std::string_view type) const noexcept;
376378
std::string getInputCppType(const InputField& field) const noexcept;

samples/schema.today.graphql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,22 @@ type NestedType {
149149
type Expensive {
150150
order: Int!
151151
}
152+
153+
input FirstNestedInput {
154+
id: ID!
155+
second: SecondNestedInput!
156+
third: ThirdNestedInput!
157+
}
158+
159+
input SecondNestedInput {
160+
id: ID!
161+
third: ThirdNestedInput!
162+
}
163+
164+
input ThirdNestedInput {
165+
id: ID!
166+
}
167+
168+
input FourthNestedInput {
169+
id: ID!
170+
}

samples/separate/TodaySchema.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,52 @@ today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(con
8888
};
8989
}
9090

91+
template <>
92+
today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const response::Value& value)
93+
{
94+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
95+
96+
return {
97+
std::move(valueId)
98+
};
99+
}
100+
101+
template <>
102+
today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(const response::Value& value)
103+
{
104+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
105+
106+
return {
107+
std::move(valueId)
108+
};
109+
}
110+
111+
template <>
112+
today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(const response::Value& value)
113+
{
114+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
115+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
116+
117+
return {
118+
std::move(valueId),
119+
std::move(valueThird)
120+
};
121+
}
122+
123+
template <>
124+
today::FirstNestedInput ModifiedArgument<today::FirstNestedInput>::convert(const response::Value& value)
125+
{
126+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
127+
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require("second", value);
128+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
129+
130+
return {
131+
std::move(valueId),
132+
std::move(valueSecond),
133+
std::move(valueThird)
134+
};
135+
}
136+
91137
} /* namespace service */
92138

93139
namespace today {
@@ -112,6 +158,14 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
112158
schema->AddType(R"gql(TaskState)gql"sv, typeTaskState);
113159
auto typeCompleteTaskInput = schema::InputObjectType::Make(R"gql(CompleteTaskInput)gql"sv, R"md()md"sv);
114160
schema->AddType(R"gql(CompleteTaskInput)gql"sv, typeCompleteTaskInput);
161+
auto typeThirdNestedInput = schema::InputObjectType::Make(R"gql(ThirdNestedInput)gql"sv, R"md()md"sv);
162+
schema->AddType(R"gql(ThirdNestedInput)gql"sv, typeThirdNestedInput);
163+
auto typeFourthNestedInput = schema::InputObjectType::Make(R"gql(FourthNestedInput)gql"sv, R"md()md"sv);
164+
schema->AddType(R"gql(FourthNestedInput)gql"sv, typeFourthNestedInput);
165+
auto typeSecondNestedInput = schema::InputObjectType::Make(R"gql(SecondNestedInput)gql"sv, R"md()md"sv);
166+
schema->AddType(R"gql(SecondNestedInput)gql"sv, typeSecondNestedInput);
167+
auto typeFirstNestedInput = schema::InputObjectType::Make(R"gql(FirstNestedInput)gql"sv, R"md()md"sv);
168+
schema->AddType(R"gql(FirstNestedInput)gql"sv, typeFirstNestedInput);
115169
auto typeUnionType = schema::UnionType::Make(R"gql(UnionType)gql"sv, R"md()md"sv);
116170
schema->AddType(R"gql(UnionType)gql"sv, typeUnionType);
117171
auto typeNode = schema::InterfaceType::Make(R"gql(Node)gql"sv, R"md(Node interface for Relay support)md"sv);
@@ -161,6 +215,21 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
161215
schema::InputValue::Make(R"gql(isComplete)gql"sv, R"md()md"sv, schema->LookupType("Boolean"), R"gql(true)gql"sv),
162216
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType("String"), R"gql()gql"sv)
163217
});
218+
typeThirdNestedInput->AddInputValues({
219+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
220+
});
221+
typeFourthNestedInput->AddInputValues({
222+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
223+
});
224+
typeSecondNestedInput->AddInputValues({
225+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
226+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
227+
});
228+
typeFirstNestedInput->AddInputValues({
229+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
230+
schema::InputValue::Make(R"gql(second)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("SecondNestedInput")), R"gql()gql"sv),
231+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
232+
});
164233

165234
typeUnionType->AddPossibleTypes({
166235
schema->LookupType(R"gql(Appointment)gql"sv),

samples/separate/TodaySchema.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,29 @@ struct CompleteTaskInput
3737
std::optional<response::StringType> clientMutationId;
3838
};
3939

40+
struct ThirdNestedInput
41+
{
42+
response::IdType id;
43+
};
44+
45+
struct FourthNestedInput
46+
{
47+
response::IdType id;
48+
};
49+
50+
struct SecondNestedInput
51+
{
52+
response::IdType id;
53+
ThirdNestedInput third;
54+
};
55+
56+
struct FirstNestedInput
57+
{
58+
response::IdType id;
59+
SecondNestedInput second;
60+
ThirdNestedInput third;
61+
};
62+
4063
namespace object {
4164

4265
class Query;

samples/separate_nointrospection/TodaySchema.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,52 @@ today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(con
8888
};
8989
}
9090

91+
template <>
92+
today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const response::Value& value)
93+
{
94+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
95+
96+
return {
97+
std::move(valueId)
98+
};
99+
}
100+
101+
template <>
102+
today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(const response::Value& value)
103+
{
104+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
105+
106+
return {
107+
std::move(valueId)
108+
};
109+
}
110+
111+
template <>
112+
today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(const response::Value& value)
113+
{
114+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
115+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
116+
117+
return {
118+
std::move(valueId),
119+
std::move(valueThird)
120+
};
121+
}
122+
123+
template <>
124+
today::FirstNestedInput ModifiedArgument<today::FirstNestedInput>::convert(const response::Value& value)
125+
{
126+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
127+
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require("second", value);
128+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
129+
130+
return {
131+
std::move(valueId),
132+
std::move(valueSecond),
133+
std::move(valueThird)
134+
};
135+
}
136+
91137
} /* namespace service */
92138

93139
namespace today {
@@ -112,6 +158,14 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
112158
schema->AddType(R"gql(TaskState)gql"sv, typeTaskState);
113159
auto typeCompleteTaskInput = schema::InputObjectType::Make(R"gql(CompleteTaskInput)gql"sv, R"md()md"sv);
114160
schema->AddType(R"gql(CompleteTaskInput)gql"sv, typeCompleteTaskInput);
161+
auto typeThirdNestedInput = schema::InputObjectType::Make(R"gql(ThirdNestedInput)gql"sv, R"md()md"sv);
162+
schema->AddType(R"gql(ThirdNestedInput)gql"sv, typeThirdNestedInput);
163+
auto typeFourthNestedInput = schema::InputObjectType::Make(R"gql(FourthNestedInput)gql"sv, R"md()md"sv);
164+
schema->AddType(R"gql(FourthNestedInput)gql"sv, typeFourthNestedInput);
165+
auto typeSecondNestedInput = schema::InputObjectType::Make(R"gql(SecondNestedInput)gql"sv, R"md()md"sv);
166+
schema->AddType(R"gql(SecondNestedInput)gql"sv, typeSecondNestedInput);
167+
auto typeFirstNestedInput = schema::InputObjectType::Make(R"gql(FirstNestedInput)gql"sv, R"md()md"sv);
168+
schema->AddType(R"gql(FirstNestedInput)gql"sv, typeFirstNestedInput);
115169
auto typeUnionType = schema::UnionType::Make(R"gql(UnionType)gql"sv, R"md()md"sv);
116170
schema->AddType(R"gql(UnionType)gql"sv, typeUnionType);
117171
auto typeNode = schema::InterfaceType::Make(R"gql(Node)gql"sv, R"md()md"sv);
@@ -161,6 +215,21 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
161215
schema::InputValue::Make(R"gql(isComplete)gql"sv, R"md()md"sv, schema->LookupType("Boolean"), R"gql(true)gql"sv),
162216
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType("String"), R"gql()gql"sv)
163217
});
218+
typeThirdNestedInput->AddInputValues({
219+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
220+
});
221+
typeFourthNestedInput->AddInputValues({
222+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
223+
});
224+
typeSecondNestedInput->AddInputValues({
225+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
226+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
227+
});
228+
typeFirstNestedInput->AddInputValues({
229+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
230+
schema::InputValue::Make(R"gql(second)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("SecondNestedInput")), R"gql()gql"sv),
231+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
232+
});
164233

165234
typeUnionType->AddPossibleTypes({
166235
schema->LookupType(R"gql(Appointment)gql"sv),

samples/separate_nointrospection/TodaySchema.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,29 @@ struct CompleteTaskInput
3737
std::optional<response::StringType> clientMutationId;
3838
};
3939

40+
struct ThirdNestedInput
41+
{
42+
response::IdType id;
43+
};
44+
45+
struct FourthNestedInput
46+
{
47+
response::IdType id;
48+
};
49+
50+
struct SecondNestedInput
51+
{
52+
response::IdType id;
53+
ThirdNestedInput third;
54+
};
55+
56+
struct FirstNestedInput
57+
{
58+
response::IdType id;
59+
SecondNestedInput second;
60+
ThirdNestedInput third;
61+
};
62+
4063
namespace object {
4164

4265
class Query;

samples/unified/TodaySchema.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,52 @@ today::CompleteTaskInput ModifiedArgument<today::CompleteTaskInput>::convert(con
8888
};
8989
}
9090

91+
template <>
92+
today::ThirdNestedInput ModifiedArgument<today::ThirdNestedInput>::convert(const response::Value& value)
93+
{
94+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
95+
96+
return {
97+
std::move(valueId)
98+
};
99+
}
100+
101+
template <>
102+
today::FourthNestedInput ModifiedArgument<today::FourthNestedInput>::convert(const response::Value& value)
103+
{
104+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
105+
106+
return {
107+
std::move(valueId)
108+
};
109+
}
110+
111+
template <>
112+
today::SecondNestedInput ModifiedArgument<today::SecondNestedInput>::convert(const response::Value& value)
113+
{
114+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
115+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
116+
117+
return {
118+
std::move(valueId),
119+
std::move(valueThird)
120+
};
121+
}
122+
123+
template <>
124+
today::FirstNestedInput ModifiedArgument<today::FirstNestedInput>::convert(const response::Value& value)
125+
{
126+
auto valueId = service::ModifiedArgument<response::IdType>::require("id", value);
127+
auto valueSecond = service::ModifiedArgument<today::SecondNestedInput>::require("second", value);
128+
auto valueThird = service::ModifiedArgument<today::ThirdNestedInput>::require("third", value);
129+
130+
return {
131+
std::move(valueId),
132+
std::move(valueSecond),
133+
std::move(valueThird)
134+
};
135+
}
136+
91137
} /* namespace service */
92138

93139
namespace today {
@@ -1107,6 +1153,14 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
11071153
schema->AddType(R"gql(TaskState)gql"sv, typeTaskState);
11081154
auto typeCompleteTaskInput = schema::InputObjectType::Make(R"gql(CompleteTaskInput)gql"sv, R"md()md"sv);
11091155
schema->AddType(R"gql(CompleteTaskInput)gql"sv, typeCompleteTaskInput);
1156+
auto typeThirdNestedInput = schema::InputObjectType::Make(R"gql(ThirdNestedInput)gql"sv, R"md()md"sv);
1157+
schema->AddType(R"gql(ThirdNestedInput)gql"sv, typeThirdNestedInput);
1158+
auto typeFourthNestedInput = schema::InputObjectType::Make(R"gql(FourthNestedInput)gql"sv, R"md()md"sv);
1159+
schema->AddType(R"gql(FourthNestedInput)gql"sv, typeFourthNestedInput);
1160+
auto typeSecondNestedInput = schema::InputObjectType::Make(R"gql(SecondNestedInput)gql"sv, R"md()md"sv);
1161+
schema->AddType(R"gql(SecondNestedInput)gql"sv, typeSecondNestedInput);
1162+
auto typeFirstNestedInput = schema::InputObjectType::Make(R"gql(FirstNestedInput)gql"sv, R"md()md"sv);
1163+
schema->AddType(R"gql(FirstNestedInput)gql"sv, typeFirstNestedInput);
11101164
auto typeUnionType = schema::UnionType::Make(R"gql(UnionType)gql"sv, R"md()md"sv);
11111165
schema->AddType(R"gql(UnionType)gql"sv, typeUnionType);
11121166
auto typeNode = schema::InterfaceType::Make(R"gql(Node)gql"sv, R"md(Node interface for Relay support)md"sv);
@@ -1156,6 +1210,21 @@ void AddTypesToSchema(const std::shared_ptr<schema::Schema>& schema)
11561210
schema::InputValue::Make(R"gql(isComplete)gql"sv, R"md()md"sv, schema->LookupType("Boolean"), R"gql(true)gql"sv),
11571211
schema::InputValue::Make(R"gql(clientMutationId)gql"sv, R"md()md"sv, schema->LookupType("String"), R"gql()gql"sv)
11581212
});
1213+
typeThirdNestedInput->AddInputValues({
1214+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
1215+
});
1216+
typeFourthNestedInput->AddInputValues({
1217+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv)
1218+
});
1219+
typeSecondNestedInput->AddInputValues({
1220+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
1221+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
1222+
});
1223+
typeFirstNestedInput->AddInputValues({
1224+
schema::InputValue::Make(R"gql(id)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ID")), R"gql()gql"sv),
1225+
schema::InputValue::Make(R"gql(second)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("SecondNestedInput")), R"gql()gql"sv),
1226+
schema::InputValue::Make(R"gql(third)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("ThirdNestedInput")), R"gql()gql"sv)
1227+
});
11591228

11601229
typeUnionType->AddPossibleTypes({
11611230
schema->LookupType(R"gql(Appointment)gql"sv),

samples/unified/TodaySchema.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,29 @@ struct CompleteTaskInput
3737
std::optional<response::StringType> clientMutationId;
3838
};
3939

40+
struct ThirdNestedInput
41+
{
42+
response::IdType id;
43+
};
44+
45+
struct FourthNestedInput
46+
{
47+
response::IdType id;
48+
};
49+
50+
struct SecondNestedInput
51+
{
52+
response::IdType id;
53+
ThirdNestedInput third;
54+
};
55+
56+
struct FirstNestedInput
57+
{
58+
response::IdType id;
59+
SecondNestedInput second;
60+
ThirdNestedInput third;
61+
};
62+
4063
namespace object {
4164

4265
class Query;

0 commit comments

Comments
 (0)