[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/gitmodimo/cppgraphqlgen/main/include/SchemaGenerator.h [Back]  [Original]

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once

#ifndef SCHEMAGENERATOR_H
#define SCHEMAGENERATOR_H

#include "SchemaLoader.h"

namespace graphql::generator::schema {

struct [[nodiscard]] GeneratorPaths
{
	const std::string headerPath;
	const std::string sourcePath;
};

struct [[nodiscard]] GeneratorOptions
{
	const GeneratorPaths paths;
	const bool verbose = false;
	const bool stubs = false;
	const bool noIntrospection = false;
};

class [[nodiscard]] Generator
{
public:
	// Initialize the generator with the introspection schema or a custom GraphQL schema.
	explicit Generator(SchemaOptions&& schemaOptions, GeneratorOptions&& options);

	// Run the generator and return a list of filenames that were output.
	[[nodiscard]] std::vector Build() const noexcept;

private:
	[[nodiscard]] std::string getHeaderDir() const noexcept;
	[[nodiscard]] std::string getSourceDir() const noexcept;
	[[nodiscard]] std::string getHeaderPath() const noexcept;
	[[nodiscard]] std::string getSourcePath() const noexcept;

	[[nodiscard]] bool outputHeader() const noexcept;
	void outputInterfaceDeclaration(std::ostream& headerFile, std::string_view cppType) const;
	void outputObjectImplements(std::ostream& headerFile, const ObjectType& objectType) const;
	void outputObjectStubs(std::ostream& headerFile, const ObjectType& objectType) const;
	void outputObjectDeclaration(
		std::ostream& headerFile, const ObjectType& objectType, bool isQueryType) const;
	[[nodiscard]] std::string getFieldDeclaration(const InputField& inputField) const noexcept;
	[[nodiscard]] std::string getFieldDeclaration(const OutputField& outputField) const noexcept;
	[[nodiscard]] std::string getResolverDeclaration(const OutputField& outputField) const noexcept;

	[[nodiscard]] bool outputSource() const noexcept;
	void outputInterfaceImplementation(std::ostream& sourceFile, std::string_view cppType) const;
	void outputInterfaceIntrospection(
		std::ostream& sourceFile, const InterfaceType& interfaceType) const;
	void outputUnionIntrospection(std::ostream& sourceFile, const UnionType& unionType) const;
	void outputObjectImplementation(
		std::ostream& sourceFile, const ObjectType& objectType, bool isQueryType) const;
	void outputObjectIntrospection(std::ostream& sourceFile, const ObjectType& objectType) const;
	void outputIntrospectionInterfaces(std::ostream& sourceFile, std::string_view cppType,
		const std::vector& interfaces) const;
	void outputIntrospectionFields(
		std::ostream& sourceFile, std::string_view cppType, const OutputFieldList& fields) const;
	[[nodiscard]] std::string getArgumentDefaultValue(
		size_t level, const response::Value& defaultValue) const noexcept;
	[[nodiscard]] std::string getArgumentDeclaration(const InputField& argument,
		const char* prefixToken, const char* argumentsToken,
		const char* defaultToken) const noexcept;
	[[nodiscard]] std::string getArgumentAccessType(const InputField& argument) const noexcept;
	[[nodiscard]] std::string getResultAccessType(const OutputField& result) const noexcept;
	[[nodiscard]] std::string getTypeModifiers(const TypeModifierStack& modifiers) const noexcept;
	[[nodiscard]] std::string getIntrospectionType(
		std::string_view type, const TypeModifierStack& modifiers) const noexcept;

	[[nodiscard]] std::vector outputSeparateFiles() const noexcept;

	static const std::string s_currentDirectory;

	SchemaLoader _loader;
	const GeneratorOptions _options;
	const std::string _headerDir;
	const std::string _sourceDir;
	const std::string _headerPath;
	const std::string _sourcePath;
};

} // namespace graphql::generator::schema

#endif // SCHEMAGENERATOR_H

Web Proxy Viewer  |  New URL  |  Original Page