Releases: microsoft/cppgraphqlgen
Work around `std::vector<std::string>` linker issue
I changed the semantics of the service::schema_exception
constructors a bit in order to work around what seems to be a linker bug. Using type inference compiles OK with the syntax service::schema_exception({ std::string(...) })
, but it complains that it can't find the definition of std::vector<std::string>
if there are no explicitly constructed instances of that type.
Oddly enough, switching to initializer syntax with an extra {}
instead of '()' for the constructor (e.g. service::schema_exception { { std::string(...) } }
) seems to be enough of a hint to the compiler/linker to include the necessary pieces of std::vector<std::string>
. This should be backwards compatible with code that still uses the old syntax, so not a breaking change, but if you continue using that syntax you might encounter the same linker bug (or whatever subtle C++ behavior this is).
Update to the latest version of PEGTL
I pulled the latest commits from PEGTL and found that the parse_tree::basic_node::is<>
method was renamed to parse_tree::basic_node::is_type<>
.
Update to C++17
Highlights from #52:
Adopting C++17
- Move to PEGTL master/3.0.0 (not yet officially released)
- Use
std::variant
forresponse::Value
- Replace
std::unique_ptr
for nullable fields withstd::optional
Schemagen improvements
- Make NYI stub generation optional
- Split the class definitions/declarations into separate files. May also help with making the NYI stubs optional (i.e. decide whether or not to compile and link them individually).
- Improve error handling/reporting.
- Add command line options for things like defining a target directory.
- Change the names of the generated
Mutation
accessors to something likeapplyFieldName
. Calling everythinggetFieldName
feels strange when performing a mutation.
Miscellaneous
- Introduce
service::FieldResult
which handles returning either by value ofT
or as astd::future<T>
- Let the caller specify the
std::launch
policy for theRequest::resolve
top-level call. - Build a separate library target for the grammar/AST.
- Replace
std::string
withstd::string_view
where appropriate. - Replace
ast<std::string>
withast<std::vector<char>>
to deal with small-string-optimization issues rather than reserving extra space when the string is too short. - Replace the
facebook::graphql
namespace with justgraphql
for the sake of brevity.
Implement default NYI stubs
I was finding it difficult to get started with a new schema or to add types to an existing schema since all of the pure virtual methods would need to be defined on the subclass before it could even link. The new feature in this release is that schemagen
will generate stub implementations which throw a std::runtime_error
exception and bubble up a "not implemented" message to the field error if they are not overridden.
This release also includes the fix for Issue #44 handling schema extensions and PR #42 which cleans up some of the USE_RAPIDJSON
handling in CMake.
Fix schema extension handling
Bug fix release with the fix for #44 in schemagen
.
Fix empty list and object results
Results for empty lists or types with no members should be included in the results. See issue #39 for more details.
Fix empty list and object results
Results for empty lists or types with no members should be included in the results. See issue #39 for more details.
Fix generated __typename resolver
I found bug #37 testing the last release against Relay. I added some asserts to one of the unit tests to protect this field in the future.
Simplify the AST handling
The change which breaks compatibility with v1.x in this release is an update to the peg::ast
definition and parsing functions. It's much simpler now, with less std::unique_ptr
juggling and pointer dereferencing.
Other than that, this release should be identical to v1.2.0. It brings the following changes from v1.1.0:
- GraphQL parse errors should be much easier to read now.
- Exceptions in a single field should no longer fail the entire request, instead it'll accumulate multiple errors and return them along with whatever partial results it was able to retrieve in the data member.
- Refactored the operation definition visitors to share more code and expose a public method
findOperationDefinition
to figure out the operation type.
Fix generated __typename resolver
I found bug #37 testing the last release against Relay. I added some asserts to one of the unit tests to protect this field in the future.