public void QueryParameterReverseMapping()
        {
            var schema        = DeserializeTestSchema("TestSchemaWithUnions");
            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator();

            generator.Generate(CreateGenerationContext(stringBuilder, schema));
            const string assemblyName = "QueryParameterReverseMappingTestAssembly";

            CompileIntoAssembly(stringBuilder.ToString(), assemblyName);

            GetQueryParameterGraphQlType(GetGeneratedType("UnderscoreNamedInput"), true).ShouldBe("underscore_named_input");
            GetQueryParameterGraphQlType(GetGeneratedType("UnderscoreNamedInput").MakeArrayType(), false).ShouldBe("[underscore_named_input]!");
            GetQueryParameterGraphQlType(typeof(ICollection <>).MakeGenericType(typeof(Int32)), true).ShouldBe("[Int]");
            GetQueryParameterGraphQlType(typeof(Double), true).ShouldBe("Float");
            GetQueryParameterGraphQlType(typeof(Decimal), false).ShouldBe("Float!");
            GetQueryParameterGraphQlType(typeof(Guid), true).ShouldBe("ID");
            GetQueryParameterGraphQlType(typeof(String), false).ShouldBe("String!");

            string GetQueryParameterGraphQlType(Type valueType, bool nullable)
            {
                var queryParameterType = GetGeneratedType("GraphQlQueryParameter`1");
                var queryParameter     = Activator.CreateInstance(queryParameterType.MakeGenericType(valueType), "parameter_name", null, nullable);

                return((string)queryParameterType.GetProperty("GraphQlTypeName", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(queryParameter));
            }

            Type GetGeneratedType(string typeName)
            {
                typeName = $"{assemblyName}.{typeName}, {assemblyName}";
                return(Type.GetType(typeName) ?? throw new InvalidOperationException($"value type \"{typeName}\" not found"));
            }
        }
        public static async Task <IReadOnlyCollection <FileInfo> > GenerateClientSourceCode(ProgramOptions options)
        {
            var schema = await GraphQlGenerator.RetrieveSchema(options.ServiceUrl, options.Authorization);

            var generatorConfiguration =
                new GraphQlGeneratorConfiguration
            {
                CSharpVersion          = options.CSharpVersion,
                ClassPostfix           = options.ClassPostfix,
                GeneratePartialClasses = options.PartialClasses,
                MemberAccessibility    = options.MemberAccessibility,
                IdTypeMapping          = options.IdTypeMapping
            };

            var generator = new GraphQlGenerator(generatorConfiguration);

            if (options.OutputType == OutputType.SingleFile)
            {
                await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace));

                return(new[] { new FileInfo(options.OutputPath) });
            }

            var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace);

            generator.Generate(multipleFileGenerationContext);
            return(multipleFileGenerationContext.Files);
        }
        public void NewCSharpSyntaxWithClassPrefixAndSuffix()
        {
            var configuration =
                new GraphQlGeneratorConfiguration
            {
                CSharpVersion       = CSharpVersion.Newest,
                ClassPrefix         = "Test",
                ClassSuffix         = "V1",
                MemberAccessibility = MemberAccessibility.Internal
            };

            var schema = DeserializeTestSchema("TestSchema2");

            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            var generatedSourceCode = StripBaseClasses(stringBuilder.ToString());
            var expectedOutput      = GetTestResource("ExpectedNewCSharpSyntaxWithClassPrefixAndSuffix");

            generatedSourceCode.ShouldBe(expectedOutput);

            CompileIntoAssembly(stringBuilder.ToString(), "GraphQLTestAssembly");

            Type.GetType("GraphQLTestAssembly.GraphQlQueryBuilder, GraphQLTestAssembly").ShouldNotBeNull();
        }
        private static async Task GenerateClientSourceCode(ProgramOptions options, List <FileInfo> generatedFiles)
        {
            GraphQlSchema schema;

            if (String.IsNullOrWhiteSpace(options.ServiceUrl))
            {
                schema = GraphQlGenerator.DeserializeGraphQlSchema(await File.ReadAllTextAsync(options.SchemaFileName));
            }
            else
            {
                if (!KeyValueParameterParser.TryGetCustomHeaders(options.Header, out var headers, out var headerParsingErrorMessage))
                {
                    throw new InvalidOperationException(headerParsingErrorMessage);
                }

                schema = await GraphQlGenerator.RetrieveSchema(new HttpMethod(options.HttpMethod), options.ServiceUrl, headers);
            }

            var generatorConfiguration =
                new GraphQlGeneratorConfiguration
            {
                CSharpVersion          = options.CSharpVersion,
                ClassPrefix            = options.ClassPrefix,
                ClassSuffix            = options.ClassSuffix,
                GeneratePartialClasses = options.PartialClasses,
                MemberAccessibility    = options.MemberAccessibility,
                IdTypeMapping          = options.IdTypeMapping,
                FloatTypeMapping       = options.FloatTypeMapping,
                JsonPropertyGeneration = options.JsonPropertyAttribute
            };

            if (!KeyValueParameterParser.TryGetCustomClassMapping(options.ClassMapping, out var customMapping, out var customMappingParsingErrorMessage))
            {
                throw new InvalidOperationException(customMappingParsingErrorMessage);
            }

            foreach (var kvp in customMapping)
            {
                generatorConfiguration.CustomClassNameMapping.Add(kvp);
            }

            var generator = new GraphQlGenerator(generatorConfiguration);

            if (options.OutputType == OutputType.SingleFile)
            {
                await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace));

                generatedFiles.Add(new FileInfo(options.OutputPath));
            }
            else
            {
                var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace);
                generator.Generate(multipleFileGenerationContext);
                generatedFiles.AddRange(multipleFileGenerationContext.Files);
            }
        }
        public void WithNullableReferences()
        {
            var configuration = new GraphQlGeneratorConfiguration {
                CSharpVersion = CSharpVersion.NewestWithNullableReferences
            };
            var schema = DeserializeTestSchema("TestSchema2");

            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            var expectedOutput      = GetTestResource("ExpectedWithNullableReferences");
            var generatedSourceCode = StripBaseClasses(stringBuilder.ToString());

            generatedSourceCode.ShouldBe(expectedOutput);
        }
Ejemplo n.º 6
0
        public void GenerateFormatMasks()
        {
            var configuration =
                new GraphQlGeneratorConfiguration
            {
                IdTypeMapping = IdTypeMapping.Custom
            };

            configuration.CustomScalarFieldTypeMapping =
                (baseType, valueType, valueName) =>
            {
                var isNotNull     = valueType.Kind == GraphQlTypeKind.NonNull;
                var unwrappedType = valueType is GraphQlFieldType fieldType?fieldType.UnwrapIfNonNull() : valueType;

                var nullablePostfix = isNotNull ? "?" : null;

                if (unwrappedType.Name == "ID")
                {
                    return new ScalarFieldTypeDescription {
                               NetTypeName = "Guid" + nullablePostfix, FormatMask = "N"
                    }
                }
                ;

                if (valueName == "before" || valueName == "after")
                {
                    return new ScalarFieldTypeDescription {
                               NetTypeName = "DateTimeOffset" + nullablePostfix, FormatMask = "yyyy-MM-dd\"T\"HH:mm"
                    }
                }
                ;

                return(configuration.DefaultScalarFieldTypeMapping(baseType, valueType, valueName));
            };

            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);
            var schema        = DeserializeTestSchema("TestSchema3");

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            var expectedDataClasses = GetTestResource("ExpectedFormatMasks");
            var generatedSourceCode = StripBaseClasses(stringBuilder.ToString());

            generatedSourceCode.ShouldBe(expectedDataClasses);
        }
        public void GenerateFormatMasks()
        {
            var configuration =
                new GraphQlGeneratorConfiguration
            {
                IdTypeMapping = IdTypeMapping.Custom,
                ScalarFieldTypeMappingProvider = TestFormatMaskScalarFieldTypeMappingProvider.Instance
            };

            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);
            var schema        = DeserializeTestSchema("TestSchema3");

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            var expectedDataClasses = GetTestResource("ExpectedFormatMasks");
            var generatedSourceCode = StripBaseClasses(stringBuilder.ToString());

            generatedSourceCode.ShouldBe(expectedDataClasses);
        }
        public void WithUnions()
        {
            var configuration =
                new GraphQlGeneratorConfiguration
            {
                CSharpVersion                  = CSharpVersion.NewestWithNullableReferences,
                JsonPropertyGeneration         = JsonPropertyGenerationOption.UseDefaultAlias,
                ScalarFieldTypeMappingProvider = TestFormatMaskScalarFieldTypeMappingProvider.Instance
            };

            var schema = DeserializeTestSchema("TestSchemaWithUnions");

            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            var expectedOutput      = GetTestResource("ExpectedWithUnions");
            var generatedSourceCode = StripBaseClasses(stringBuilder.ToString());

            generatedSourceCode.ShouldBe(expectedOutput);
        }
        public void GeneratedMutation()
        {
            var schema        = DeserializeTestSchema("TestSchema2");
            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator();

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            stringBuilder.AppendLine();
            stringBuilder.AppendLine(
                @"public class TestMutationBuilder : GraphQlQueryBuilder<TestMutationBuilder>
{
    private static readonly FieldMetadata[] AllFieldMetadata =
        new []
        {
            new FieldMetadata { Name = ""testAction"" },
        };

    protected override string TypeName { get; } = ""TestMutation"";

    public override IReadOnlyList<FieldMetadata> AllFields { get; } = AllFieldMetadata;

    public TestMutationBuilder(string operationName = null) : base(""mutation"", operationName)
    {
    }

    public TestMutationBuilder WithParameter<T>(GraphQlQueryParameter<T> parameter) => WithParameterInternal(parameter);

	public TestMutationBuilder WithTestAction(QueryBuilderParameter<TestInput> input = null)
	{
		var args = new List<QueryBuilderArgumentInfo>();
		if (input != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""objectParameter"", ArgumentValue = input });

        return WithScalarField(""testAction"", null, null, args);
    }
}

    public partial class TestInput : IGraphQlInputObject
    {
	    private InputPropertyInfo _inputObject1;
	    private InputPropertyInfo _inputObject2;
        private InputPropertyInfo _testProperty;
        private InputPropertyInfo _testNullValueProperty;
        private InputPropertyInfo _timestampProperty;

	    [JsonConverter(typeof(QueryBuilderParameterConverter<TestInput>))]
	    public QueryBuilderParameter<TestInput> InputObject1
	    {
		    get => (QueryBuilderParameter<TestInput>)_inputObject1.Value;
		    set => _inputObject1 = new InputPropertyInfo { Name = ""inputObject1"", Value = value };
	    }

	    [JsonConverter(typeof(QueryBuilderParameterConverter<TestInput>))]
	    public QueryBuilderParameter<TestInput> InputObject2
	    {
		    get => (QueryBuilderParameter<TestInput>)_inputObject2.Value;
		    set => _inputObject2 = new InputPropertyInfo { Name = ""inputObject2"", Value = value };
	    }

        [JsonConverter(typeof(QueryBuilderParameterConverter<string>))]
	    public QueryBuilderParameter<string> TestProperty
	    {
		    get => (QueryBuilderParameter<string>)_testProperty.Value;
		    set => _testProperty = new InputPropertyInfo { Name = ""testProperty"", Value = value };
	    }

        [JsonConverter(typeof(QueryBuilderParameterConverter<string>))]
	    public QueryBuilderParameter<string> TestNullValueProperty
	    {
		    get => (QueryBuilderParameter<string>)_testNullValueProperty.Value;
		    set => _testNullValueProperty = new InputPropertyInfo { Name = ""testNullValueProperty"", Value = value };
	    }

        [JsonConverter(typeof(QueryBuilderParameterConverter<DateTimeOffset?>))]
	    public QueryBuilderParameter<DateTimeOffset?> Timestamp
	    {
		    get => (QueryBuilderParameter<DateTimeOffset?>)_timestampProperty.Value;
		    set => _timestampProperty = new InputPropertyInfo { Name = ""timestamp"", Value = value, FormatMask = ""yy-MM-dd HH:mmzzz"" };
	    }

	    IEnumerable<InputPropertyInfo> IGraphQlInputObject.GetPropertyValues()
	    {
		    if (_inputObject1.Name != null) yield return _inputObject1;
		    if (_inputObject2.Name != null) yield return _inputObject2;
            if (_testProperty.Name != null) yield return _testProperty;
            if (_testNullValueProperty.Name != null) yield return _testNullValueProperty;
            if (_timestampProperty.Name != null) yield return _timestampProperty;
	    }
    }");

            const string assemblyName = "GeneratedMutationTestAssembly";

            CompileIntoAssembly(stringBuilder.ToString(), assemblyName);

            var builderType = Type.GetType($"{assemblyName}.TestMutationBuilder, {assemblyName}");

            builderType.ShouldNotBeNull();
            var formattingType = Type.GetType($"{assemblyName}.Formatting, {assemblyName}");

            formattingType.ShouldNotBeNull();

            var builderInstance = Activator.CreateInstance(builderType, new object[] { null });

            var inputObjectType = Type.GetType($"{assemblyName}.TestInput, {assemblyName}");

            inputObjectType.ShouldNotBeNull();

            var queryParameter2Value = Activator.CreateInstance(inputObjectType);
            var queryParameter1      = CreateParameter(assemblyName, "Test Value", "stringParameter", "String");
            var queryParameter2      = CreateParameter(assemblyName, queryParameter2Value, "objectParameter", "[TestInput!]");
            var testPropertyInfo     = inputObjectType.GetProperty("TestProperty");

            testPropertyInfo.SetValue(queryParameter2Value, CreateParameter(assemblyName, "Input Object Parameter Value"));
            var timestampPropertyInfo = inputObjectType.GetProperty("Timestamp");

            timestampPropertyInfo.SetValue(queryParameter2Value, CreateParameter(assemblyName, new DateTimeOffset(2019, 6, 30, 2, 27, 47, TimeSpan.FromHours(2)).AddTicks(1234567)));

            var inputObject = Activator.CreateInstance(inputObjectType);

            testPropertyInfo.SetValue(inputObject, queryParameter1);
            var nestedObject = Activator.CreateInstance(inputObjectType);

            testPropertyInfo.SetValue(nestedObject, CreateParameter(assemblyName, "Nested Value"));
            inputObjectType.GetProperty("InputObject1").SetValue(inputObject, CreateParameter(assemblyName, nestedObject));
            inputObjectType.GetProperty("InputObject2").SetValue(inputObject, queryParameter2);
            inputObjectType.GetProperty("TestNullValueProperty").SetValue(inputObject, CreateParameter(assemblyName, null, null, "String", typeof(String)));

            builderType
            .GetMethod("WithTestAction", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(
                builderInstance,
                new []
            {
                inputObject
            }.Select(p => CreateParameter(assemblyName, p)).ToArray());

            var withParameterMethod = builderType.GetMethod("WithParameter", BindingFlags.Instance | BindingFlags.Public);

            withParameterMethod.MakeGenericMethod(typeof(String)).Invoke(builderInstance, new[] { queryParameter1 });
            withParameterMethod.MakeGenericMethod(queryParameter2Value.GetType()).Invoke(builderInstance, new[] { queryParameter2 });

            var mutation =
                builderType
                .GetMethod("Build", BindingFlags.Instance | BindingFlags.Public)
                .Invoke(builderInstance, new[] { Enum.Parse(formattingType, "None"), (byte)2 });

            mutation.ShouldBe("mutation($stringParameter:String=\"Test Value\",$objectParameter:[TestInput!]={testProperty:\"Input Object Parameter Value\",timestamp:\"19-06-30 02:27+02:00\"}){testAction(objectParameter:{inputObject1:{testProperty:\"Nested Value\"},inputObject2:$objectParameter,testProperty:$stringParameter,testNullValueProperty:null})}");

            var inputObjectJson = JsonConvert.SerializeObject(inputObject);

            inputObjectJson.ShouldBe("{\"TestProperty\":\"Test Value\",\"Timestamp\":null,\"InputObject1\":{\"TestProperty\":\"Nested Value\",\"Timestamp\":null,\"InputObject1\":null,\"InputObject2\":null,\"TestNullValueProperty\":null},\"InputObject2\":{\"TestProperty\":\"Input Object Parameter Value\",\"Timestamp\":\"2019-06-30T02:27:47.1234567+02:00\",\"InputObject1\":null,\"InputObject2\":null,\"TestNullValueProperty\":null},\"TestNullValueProperty\":null}");

            var deserializedInputObject = JsonConvert.DeserializeObject(inputObjectJson, inputObjectType);
            var testPropertyValue       = testPropertyInfo.GetValue(deserializedInputObject);
            var converter = testPropertyValue.GetType().GetMethod("op_Implicit", new[] { testPropertyValue.GetType() });
            var testPropertyPlainValue = converter.Invoke(null, new[] { testPropertyValue });

            testPropertyPlainValue.ShouldBe("Test Value");
        }
        public void GeneratedQuery()
        {
            var configuration = new GraphQlGeneratorConfiguration {
                JsonPropertyGeneration = JsonPropertyGenerationOption.Always
            };

            var schema        = DeserializeTestSchema("TestSchema2");
            var stringBuilder = new StringBuilder();
            var generator     = new GraphQlGenerator(configuration);

            generator.Generate(CreateGenerationContext(stringBuilder, schema));

            stringBuilder.AppendLine();
            stringBuilder.AppendLine(
                @"public class TestQueryBuilder : GraphQlQueryBuilder<TestQueryBuilder>
{
    private static readonly FieldMetadata[] AllFieldMetadata =
        new []
        {
            new FieldMetadata { Name = ""testField"" },
            new FieldMetadata { Name = ""objectParameter"" }
        };

    protected override string TypeName { get; } = ""Test"";

    public override IReadOnlyList<FieldMetadata> AllFields { get; } = AllFieldMetadata;

	public TestQueryBuilder WithTestField(
        QueryBuilderParameter<short?> valueInt16 = null,
        QueryBuilderParameter<ushort?> valueUInt16 = null,
        QueryBuilderParameter<byte?> valueByte = null,
        QueryBuilderParameter<int?> valueInt32 = null,
        QueryBuilderParameter<uint?> valueUInt32 = null,
        QueryBuilderParameter<long?> valueInt64 = null,
        QueryBuilderParameter<ulong?> valueUInt64 = null,
        QueryBuilderParameter<float?> valueSingle = null,
        QueryBuilderParameter<double?> valueDouble = null,
        QueryBuilderParameter<decimal?> valueDecimal = null,
        QueryBuilderParameter<DateTime?> valueDateTime = null,
        QueryBuilderParameter<DateTimeOffset?> valueDateTimeOffset = null,
        QueryBuilderParameter<Guid?> valueGuid = null,
        QueryBuilderParameter<string> valueString = null)
	{
		var args = new List<QueryBuilderArgumentInfo>();
		if (valueInt16 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueInt16"", ArgumentValue = valueInt16 });

		if (valueUInt16 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueUInt16"", ArgumentValue = valueUInt16 });

		if (valueByte != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueByte"", ArgumentValue = valueByte });

		if (valueInt32 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueInt32"", ArgumentValue = valueInt32 });

		if (valueUInt32 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueUInt32"", ArgumentValue = valueUInt32 });

		if (valueInt64 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueInt64"", ArgumentValue = valueInt64 });

		if (valueUInt64 != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueUInt64"", ArgumentValue = valueUInt64 });

		if (valueSingle != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueSingle"", ArgumentValue = valueSingle });

		if (valueDouble != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueDouble"", ArgumentValue = valueDouble });

		if (valueDecimal != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueDecimal"", ArgumentValue = valueDecimal });

		if (valueDateTime != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueDateTime"", ArgumentValue = valueDateTime, FormatMask = ""yy-MM-dd HH:mmZ"" });

		if (valueDateTimeOffset != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueDateTimeOffset"", ArgumentValue = valueDateTimeOffset });

		if (valueGuid != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueGuid"", ArgumentValue = valueGuid });

		if (valueString != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""valueString"", ArgumentValue = valueString });

		return WithScalarField(""testField"", null, null, args);
	}

    public TestQueryBuilder WithObjectParameterField(QueryBuilderParameter<object> objectParameter = null)
	{
		var args = new List<QueryBuilderArgumentInfo>();
		if (objectParameter != null)
			args.Add(new QueryBuilderArgumentInfo { ArgumentName = ""objectParameter"", ArgumentValue = objectParameter });

        return WithScalarField(""objectParameter"", ""fieldAlias"", new GraphQlDirective[] { new IncludeDirective(new GraphQlQueryParameter<bool>(""direct"", ""Boolean"", true)), new SkipDirective((QueryBuilderParameter<bool>)false) }, args);
    }

    public TestQueryBuilder WithTestFragment(MeQueryBuilder queryBuilder) => WithFragment(queryBuilder, null);
}");

            const string assemblyName = "GeneratedQueryTestAssembly";

            CompileIntoAssembly(stringBuilder.ToString(), assemblyName);

            var builderType = Type.GetType($"{assemblyName}.TestQueryBuilder, {assemblyName}");

            builderType.ShouldNotBeNull();
            var formattingType = Type.GetType($"{assemblyName}.Formatting, {assemblyName}");

            formattingType.ShouldNotBeNull();

            var builderInstance = Activator.CreateInstance(builderType);

            builderType
            .GetMethod("WithTestField", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(
                builderInstance,
                new object[]
            {
                (short)1,
                (ushort)2,
                (byte)3,
                4,
                (uint)5,
                6L,
                (ulong)7,
                8.123f,
                9.456d,
                10.789m,
                new DateTime(2019, 6, 30, 0, 27, 47, DateTimeKind.Utc).AddTicks(1234567),
                new DateTimeOffset(2019, 6, 30, 2, 27, 47, TimeSpan.FromHours(2)).AddTicks(1234567),
                Guid.Empty,
                "string value"
            }.Select(p => CreateParameter(assemblyName, p)).ToArray());

            builderType
            .GetMethod("WithObjectParameterField", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(
                builderInstance,
                new object[]
            {
                new []
                {
                    JsonConvert.DeserializeObject("{ \"rootProperty1\": \"root value 1\", \"rootProperty2\": 123.456, \"rootProperty3\": true, \"rootProperty4\": null, \"rootProperty5\": { \"nestedProperty\": 987 } }"),
                    JsonConvert.DeserializeObject("[{ \"rootProperty1\": \"root value 2\" }, { \"rootProperty1\": false }]")
                }
            }.Select(p => CreateParameter(assemblyName, p)).ToArray());

            var query =
                builderType
                .GetMethod("Build", BindingFlags.Instance | BindingFlags.Public)
                .Invoke(builderInstance, new [] { Enum.Parse(formattingType, "None"), (byte)2 });

            query.ShouldBe("{testField(valueInt16:1,valueUInt16:2,valueByte:3,valueInt32:4,valueUInt32:5,valueInt64:6,valueUInt64:7,valueSingle:8.123,valueDouble:9.456,valueDecimal:10.789,valueDateTime:\"19-06-30 00:27Z\",valueDateTimeOffset:\"2019-06-30T02:27:47.1234567+02:00\",valueGuid:\"00000000-0000-0000-0000-000000000000\",valueString:\"string value\"),fieldAlias:objectParameter(objectParameter:[{rootProperty1:\"root value 1\",rootProperty2:123.456,rootProperty3:true,rootProperty4:null,rootProperty5:{nestedProperty:987}},[{rootProperty1:\"root value 2\"},{rootProperty1:false}]])@include(if:$direct)@skip(if:false)}");
            query =
                builderType
                .GetMethod("Build", BindingFlags.Instance | BindingFlags.Public)
                .Invoke(builderInstance, new[] { Enum.Parse(formattingType, "Indented"), (byte)2 });

            query.ShouldBe($" {{{Environment.NewLine}  testField(valueInt16: 1, valueUInt16: 2, valueByte: 3, valueInt32: 4, valueUInt32: 5, valueInt64: 6, valueUInt64: 7, valueSingle: 8.123, valueDouble: 9.456, valueDecimal: 10.789, valueDateTime: \"19-06-30 00:27Z\", valueDateTimeOffset: \"2019-06-30T02:27:47.1234567+02:00\", valueGuid: \"00000000-0000-0000-0000-000000000000\", valueString: \"string value\"){Environment.NewLine}  fieldAlias: objectParameter(objectParameter: [{Environment.NewLine}    {{{Environment.NewLine}      rootProperty1: \"root value 1\",{Environment.NewLine}      rootProperty2: 123.456,{Environment.NewLine}      rootProperty3: true,{Environment.NewLine}      rootProperty4: null,{Environment.NewLine}      rootProperty5: {{{Environment.NewLine}        nestedProperty: 987}}}},{Environment.NewLine}    [{Environment.NewLine}    {{{Environment.NewLine}      rootProperty1: \"root value 2\"}},{Environment.NewLine}    {{{Environment.NewLine}      rootProperty1: false}}]]) @include(if: $direct) @skip(if: false){Environment.NewLine}}}");

            var rootQueryBuilderType = Type.GetType($"{assemblyName}.QueryQueryBuilder, {assemblyName}");

            rootQueryBuilderType.ShouldNotBeNull();
            var rootQueryBuilderInstance = rootQueryBuilderType.GetConstructor(new [] { typeof(string) }).Invoke(new object[1]);

            rootQueryBuilderType.GetMethod("WithAllFields", BindingFlags.Instance | BindingFlags.Public).Invoke(rootQueryBuilderInstance, null);
            rootQueryBuilderType
            .GetMethod("Build", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(rootQueryBuilderInstance, new[] { Enum.Parse(formattingType, "None"), (byte)2 });

            builderType
            .GetMethod("Clear", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(builderInstance, null);

            var meBuilderType = Type.GetType($"{assemblyName}.MeQueryBuilder, {assemblyName}");
            var childFragmentBuilderInstance = Activator.CreateInstance(meBuilderType);

            meBuilderType.GetMethod("WithAllScalarFields", BindingFlags.Instance | BindingFlags.Public).Invoke(childFragmentBuilderInstance, null);

            builderType
            .GetMethod("WithTestFragment", BindingFlags.Instance | BindingFlags.Public)
            .Invoke(builderInstance, new [] { childFragmentBuilderInstance });

            query =
                builderType
                .GetMethod("Build", BindingFlags.Instance | BindingFlags.Public)
                .Invoke(builderInstance, new[] { Enum.Parse(formattingType, "None"), (byte)2 });

            query.ShouldBe("{...on Me{id,firstName,lastName,fullName,ssn,email,language,tone,mobile}}");
        }
        public void MultipleFileGeneration()
        {
            var configuration =
                new GraphQlGeneratorConfiguration
            {
                CommentGeneration = CommentGenerationOption.CodeSummary | CommentGenerationOption.DescriptionAttribute,
                CSharpVersion     = CSharpVersion.Newest
            };

            var generator = new GraphQlGenerator(configuration);

            var tempPath      = Path.GetTempPath();
            var directoryInfo = Directory.CreateDirectory(Path.Combine(tempPath, "GraphQlGeneratorTest"));

            try
            {
                var context = new MultipleFileGenerationContext(DeserializeTestSchema("TestSchema2"), directoryInfo.FullName, "GraphQlGeneratorTest", "GraphQlGeneratorTest.csproj");
                generator.Generate(context);

                var files     = directoryInfo.GetFiles().OrderBy(f => f.Name).ToArray();
                var fileNames = files.Select(f => f.Name);
                fileNames.ShouldBe(
                    new[]
                {
                    "About.cs",
                    "AboutItem.cs",
                    "AboutItemQueryBuilder.cs",
                    "AboutQueryBuilder.cs",
                    "Address.cs",
                    "AddressQueryBuilder.cs",
                    "AppState.cs",
                    "AppStateFronScreen.cs",
                    "AppStateFronScreenMutation.cs",
                    "AppStateFronScreenQueryBuilder.cs",
                    "AppStateJourney.cs",
                    "AppStateJourneyMutation.cs",
                    "AppStateJourneyQueryBuilder.cs",
                    "AppStateMutation.cs",
                    "AppStateQueryBuilder.cs",
                    "Avatar.cs",
                    "AwayMode.cs",
                    "AwayModeQueryBuilder.cs",
                    "AwayModeSettings.cs",
                    "AwayModeSettingsQueryBuilder.cs",
                    "BaseClasses.cs",
                    "Comparison.cs",
                    "ComparisonData.cs",
                    "ComparisonDataQueryBuilder.cs",
                    "ComparisonQueryBuilder.cs",
                    "Consumption.cs",
                    "ConsumptionMonth.cs",
                    "ConsumptionMonthQueryBuilder.cs",
                    "ConsumptionQueryBuilder.cs",
                    "CreditCard.cs",
                    "CreditCardQueryBuilder.cs",
                    "DayNightSchedule.cs",
                    "DayNightScheduleQueryBuilder.cs",
                    "DayNightScheduleSettings.cs",
                    "DayNightScheduleSettingsQueryBuilder.cs",
                    "Disaggregation.cs",
                    "DisaggregationQueryBuilder.cs",
                    "EnergyDeal.cs",
                    "EnergyDealQueryBuilder.cs",
                    "Feed.cs",
                    "FeedItem.cs",
                    "FeedItemQueryBuilder.cs",
                    "FeedQueryBuilder.cs",
                    "GqlMutationError.cs",
                    "GqlMutationErrorQueryBuilder.cs",
                    "GqlMutationGeneralResponse.cs",
                    "GqlMutationGeneralResponseQueryBuilder.cs",
                    "GraphQlGeneratorTest.csproj",
                    "GraphQlTypes.cs",
                    "Greeting.cs",
                    "GreetingQueryBuilder.cs",
                    "Home.cs",
                    "HomeMutation.cs",
                    "HomeMutationQueryBuilder.cs",
                    "HomeProfileQuestion.cs",
                    "HomeProfileQuestionAnswer.cs",
                    "HomeProfileQuestionInput.cs",
                    "HomeProfileQuestionInputQueryBuilder.cs",
                    "HomeProfileQuestionQueryBuilder.cs",
                    "HomeQueryBuilder.cs",
                    "IncludeDirective.cs",
                    "Invoice.cs",
                    "InvoicePayment.cs",
                    "InvoicePaymentQueryBuilder.cs",
                    "InvoiceQueryBuilder.cs",
                    "InvoiceSection.cs",
                    "InvoiceSectionQueryBuilder.cs",
                    "Me.cs",
                    "MeMutation.cs",
                    "MeMutationQueryBuilder.cs",
                    "MeQueryBuilder.cs",
                    "Mutation.cs",
                    "MutationQueryBuilder.cs",
                    "PairableDevice.cs",
                    "PairableDeviceOAuth.cs",
                    "PairableDeviceOAuthQueryBuilder.cs",
                    "PairableDeviceQueryBuilder.cs",
                    "PairDeviceResult.cs",
                    "PairDeviceResultQueryBuilder.cs",
                    "PaymentMethod.cs",
                    "PaymentMethodQueryBuilder.cs",
                    "PreLiveComparison.cs",
                    "PreLiveComparisonQueryBuilder.cs",
                    "PriceRating.cs",
                    "PriceRatingColorOffset.cs",
                    "PriceRatingColorOffsetQueryBuilder.cs",
                    "PriceRatingEntry.cs",
                    "PriceRatingEntryQueryBuilder.cs",
                    "PriceRatingQueryBuilder.cs",
                    "PriceRatingRoot.cs",
                    "PriceRatingRootQueryBuilder.cs",
                    "ProcessStep.cs",
                    "ProcessStepQueryBuilder.cs",
                    "Producer.cs",
                    "ProducerBullet.cs",
                    "ProducerBulletQueryBuilder.cs",
                    "ProducerQueryBuilder.cs",
                    "Production.cs",
                    "ProductionMonth.cs",
                    "ProductionMonthQueryBuilder.cs",
                    "ProductionQueryBuilder.cs",
                    "ProductionValue.cs",
                    "ProductionValueQueryBuilder.cs",
                    "PushNotification.cs",
                    "PushNotificationQueryBuilder.cs",
                    "Query.cs",
                    "QueryQueryBuilder.cs",
                    "Report.cs",
                    "ReportCell.cs",
                    "ReportCellQueryBuilder.cs",
                    "ReportQueryBuilder.cs",
                    "ReportRoot.cs",
                    "ReportRootQueryBuilder.cs",
                    "Resolution.cs",
                    "Sensor.cs",
                    "SensorHistory.cs",
                    "SensorHistoryQueryBuilder.cs",
                    "SensorHistoryValue.cs",
                    "SensorHistoryValueQueryBuilder.cs",
                    "SensorQueryBuilder.cs",
                    "SignupStatus.cs",
                    "SignupStatusQueryBuilder.cs",
                    "SkipDirective.cs",
                    "Subscription.cs",
                    "SubscriptionQueryBuilder.cs",
                    "Thermostat.cs",
                    "ThermostatCapability.cs",
                    "ThermostatCapabilityQueryBuilder.cs",
                    "ThermostatMeasurement.cs",
                    "ThermostatMeasurementQueryBuilder.cs",
                    "ThermostatMeasurements.cs",
                    "ThermostatMeasurementsQueryBuilder.cs",
                    "ThermostatMode.cs",
                    "ThermostatModeQueryBuilder.cs",
                    "ThermostatMutation.cs",
                    "ThermostatMutationQueryBuilder.cs",
                    "ThermostatQueryBuilder.cs",
                    "ThermostatState.cs",
                    "ThermostatStateQueryBuilder.cs",
                    "Wallet.cs",
                    "WalletQueryBuilder.cs",
                    "Weather.cs",
                    "WeatherEntry.cs",
                    "WeatherEntryQueryBuilder.cs",
                    "WeatherQueryBuilder.cs"
                });

                var fileSizes = files.Where(f => f.Name != "BaseClasses.cs").Select(f => f.Length);
                fileSizes.ShouldBe(
                    new long[]
                {
                    370, 399, 1295, 1082, 902, 4131, 443, 493, 2056, 1831, 379, 1038, 1076, 1609, 1675, 680, 418, 1507, 422, 1334, 716, 415, 1365, 4006, 887, 686, 3557, 4906, 402, 1312, 490, 2119, 537, 2296, 1149, 6812, 371, 1153, 495, 600, 2706, 2476, 413, 1389, 385, 1215, 368, 5985, 518, 2132, 1881, 845, 7805, 803, 1454, 417, 1433, 4626, 17076, 731, 1550, 551, 2587, 9743, 896, 5100, 1025, 476, 3221, 7042, 358, 1339, 467, 425, 1445, 1890, 499, 2175, 455, 1733, 545, 2501, 691, 495, 1921, 505, 2085, 3516, 679, 3759, 512, 2080, 600, 461, 1749, 2837, 996, 719, 3864, 5591, 822, 4380, 444, 1682, 347, 1283, 588, 675, 3451, 2781, 374, 1105, 404, 513, 483, 1902, 472, 1765, 2209, 483, 2143, 706, 777, 4324, 862, 454, 1756, 796, 4433, 508, 2005, 425, 1388, 413, 2590, 4949, 510, 2124, 482, 1874, 485, 1154, 3506, 1874
                });

                var expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Avatar");
                File.ReadAllText(Path.Combine(directoryInfo.FullName, "Avatar.cs")).ShouldBe(expectedOutput);
                expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Home");
                File.ReadAllText(Path.Combine(directoryInfo.FullName, "Home.cs")).ShouldBe(expectedOutput);
                expectedOutput = GetTestResource("ExpectedMultipleFilesContext.IncludeDirective");
                File.ReadAllText(Path.Combine(directoryInfo.FullName, "IncludeDirective.cs")).ShouldBe(expectedOutput);
                expectedOutput = GetTestResource("ExpectedMultipleFilesContext.MutationQueryBuilder");
                File.ReadAllText(Path.Combine(directoryInfo.FullName, "MutationQueryBuilder.cs")).ShouldBe(expectedOutput);
            }
            finally
            {
                Directory.Delete(directoryInfo.FullName, true);
            }
        }
    public void MultipleFileGeneration()
    {
        var configuration =
            new GraphQlGeneratorConfiguration
        {
            CommentGeneration = CommentGenerationOption.CodeSummary | CommentGenerationOption.DescriptionAttribute,
            CSharpVersion     = CSharpVersion.Newest
        };

        var generator = new GraphQlGenerator(configuration);

        var tempPath      = Path.GetTempPath();
        var directoryInfo = Directory.CreateDirectory(Path.Combine(tempPath, "GraphQlGeneratorTest"));

        try
        {
            var context = new MultipleFileGenerationContext(DeserializeTestSchema("TestSchema2"), directoryInfo.FullName, "GraphQlGeneratorTest", "GraphQlGeneratorTest.csproj");
            generator.Generate(context);

            var files     = directoryInfo.GetFiles().OrderBy(f => f.Name).ToArray();
            var fileNames = files.Select(f => f.Name);
            fileNames.ShouldBe(
                new[]
            {
                "About.cs",
                "AboutItem.cs",
                "AboutItemQueryBuilder.cs",
                "AboutQueryBuilder.cs",
                "Address.cs",
                "AddressQueryBuilder.cs",
                "AppState.cs",
                "AppStateFronScreen.cs",
                "AppStateFronScreenMutation.cs",
                "AppStateFronScreenQueryBuilder.cs",
                "AppStateJourney.cs",
                "AppStateJourneyMutation.cs",
                "AppStateJourneyQueryBuilder.cs",
                "AppStateMutation.cs",
                "AppStateQueryBuilder.cs",
                "Avatar.cs",
                "AwayMode.cs",
                "AwayModeQueryBuilder.cs",
                "AwayModeSettings.cs",
                "AwayModeSettingsQueryBuilder.cs",
                "BaseClasses.cs",
                "Comparison.cs",
                "ComparisonData.cs",
                "ComparisonDataQueryBuilder.cs",
                "ComparisonQueryBuilder.cs",
                "Consumption.cs",
                "ConsumptionMonth.cs",
                "ConsumptionMonthQueryBuilder.cs",
                "ConsumptionQueryBuilder.cs",
                "CreditCard.cs",
                "CreditCardQueryBuilder.cs",
                "DayNightSchedule.cs",
                "DayNightScheduleQueryBuilder.cs",
                "DayNightScheduleSettings.cs",
                "DayNightScheduleSettingsQueryBuilder.cs",
                "Disaggregation.cs",
                "DisaggregationQueryBuilder.cs",
                "EnergyDeal.cs",
                "EnergyDealQueryBuilder.cs",
                "Feed.cs",
                "FeedItem.cs",
                "FeedItemQueryBuilder.cs",
                "FeedQueryBuilder.cs",
                "GqlMutationError.cs",
                "GqlMutationErrorQueryBuilder.cs",
                "GqlMutationGeneralResponse.cs",
                "GqlMutationGeneralResponseQueryBuilder.cs",
                "GraphQlGeneratorTest.csproj",
                "GraphQlTypes.cs",
                "Greeting.cs",
                "GreetingQueryBuilder.cs",
                "Home.cs",
                "HomeMutation.cs",
                "HomeMutationQueryBuilder.cs",
                "HomeProfileQuestion.cs",
                "HomeProfileQuestionAnswer.cs",
                "HomeProfileQuestionInput.cs",
                "HomeProfileQuestionInputQueryBuilder.cs",
                "HomeProfileQuestionQueryBuilder.cs",
                "HomeQueryBuilder.cs",
                "IncludeDirective.cs",
                "Invoice.cs",
                "InvoicePayment.cs",
                "InvoicePaymentQueryBuilder.cs",
                "InvoiceQueryBuilder.cs",
                "InvoiceSection.cs",
                "InvoiceSectionQueryBuilder.cs",
                "Me.cs",
                "MeMutation.cs",
                "MeMutationQueryBuilder.cs",
                "MeQueryBuilder.cs",
                "Mutation.cs",
                "MutationQueryBuilder.cs",
                "PairableDevice.cs",
                "PairableDeviceOAuth.cs",
                "PairableDeviceOAuthQueryBuilder.cs",
                "PairableDeviceQueryBuilder.cs",
                "PairDeviceResult.cs",
                "PairDeviceResultQueryBuilder.cs",
                "PaymentMethod.cs",
                "PaymentMethodQueryBuilder.cs",
                "PreLiveComparison.cs",
                "PreLiveComparisonQueryBuilder.cs",
                "PriceRating.cs",
                "PriceRatingColorOffset.cs",
                "PriceRatingColorOffsetQueryBuilder.cs",
                "PriceRatingEntry.cs",
                "PriceRatingEntryQueryBuilder.cs",
                "PriceRatingQueryBuilder.cs",
                "PriceRatingRoot.cs",
                "PriceRatingRootQueryBuilder.cs",
                "ProcessStep.cs",
                "ProcessStepQueryBuilder.cs",
                "Producer.cs",
                "ProducerBullet.cs",
                "ProducerBulletQueryBuilder.cs",
                "ProducerQueryBuilder.cs",
                "Production.cs",
                "ProductionMonth.cs",
                "ProductionMonthQueryBuilder.cs",
                "ProductionQueryBuilder.cs",
                "ProductionValue.cs",
                "ProductionValueQueryBuilder.cs",
                "PushNotification.cs",
                "PushNotificationQueryBuilder.cs",
                "Query.cs",
                "QueryQueryBuilder.cs",
                "Report.cs",
                "ReportCell.cs",
                "ReportCellQueryBuilder.cs",
                "ReportQueryBuilder.cs",
                "ReportRoot.cs",
                "ReportRootQueryBuilder.cs",
                "Resolution.cs",
                "Sensor.cs",
                "SensorHistory.cs",
                "SensorHistoryQueryBuilder.cs",
                "SensorHistoryValue.cs",
                "SensorHistoryValueQueryBuilder.cs",
                "SensorQueryBuilder.cs",
                "SignupStatus.cs",
                "SignupStatusQueryBuilder.cs",
                "SkipDirective.cs",
                "Subscription.cs",
                "SubscriptionQueryBuilder.cs",
                "Thermostat.cs",
                "ThermostatCapability.cs",
                "ThermostatCapabilityQueryBuilder.cs",
                "ThermostatMeasurement.cs",
                "ThermostatMeasurementQueryBuilder.cs",
                "ThermostatMeasurements.cs",
                "ThermostatMeasurementsQueryBuilder.cs",
                "ThermostatMode.cs",
                "ThermostatModeQueryBuilder.cs",
                "ThermostatMutation.cs",
                "ThermostatMutationQueryBuilder.cs",
                "ThermostatQueryBuilder.cs",
                "ThermostatState.cs",
                "ThermostatStateQueryBuilder.cs",
                "Wallet.cs",
                "WalletQueryBuilder.cs",
                "Weather.cs",
                "WeatherEntry.cs",
                "WeatherEntryQueryBuilder.cs",
                "WeatherQueryBuilder.cs"
            });

            var fileSizes = files.Where(f => f.Name != "BaseClasses.cs").Select(f => f.Length);
            fileSizes.ShouldBe(
                new long[]
            {
                446, 475, 1371, 1158, 978, 4207, 519, 569, 2132, 1907, 455, 1114, 1152, 1685, 1751, 756, 494, 1583, 498, 1410, 792, 491, 1441, 4082, 963, 762, 3633, 4982, 478, 1388, 566, 2195, 613, 2372, 1225, 6888, 447, 1229, 571, 676, 2782, 2552, 489, 1465, 461, 1291, 368, 6061, 594, 2208, 1957, 921, 7881, 879, 1530, 493, 1509, 4702, 17152, 807, 1626, 627, 2663, 9819, 972, 5176, 1101, 552, 3297, 7118, 434, 1415, 543, 501, 1521, 1966, 575, 2251, 531, 1809, 621, 2577, 767, 571, 1997, 581, 2161, 3592, 755, 3835, 588, 2156, 676, 537, 1825, 2913, 1072, 795, 3940, 5667, 898, 4456, 520, 1758, 423, 1359, 664, 751, 3527, 2857, 450, 1181, 480, 589, 559, 1978, 548, 1841, 2285, 559, 2219, 782, 853, 4400, 938, 530, 1832, 872, 4509, 584, 2081, 501, 1464, 489, 2666, 5025, 586, 2200, 558, 1950, 561, 1230, 3582, 1950
            });

            var expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Avatar");
            File.ReadAllText(Path.Combine(directoryInfo.FullName, "Avatar.cs")).ShouldBe(expectedOutput);
            expectedOutput = GetTestResource("ExpectedMultipleFilesContext.Home");
            File.ReadAllText(Path.Combine(directoryInfo.FullName, "Home.cs")).ShouldBe(expectedOutput);
            expectedOutput = GetTestResource("ExpectedMultipleFilesContext.IncludeDirective");
            File.ReadAllText(Path.Combine(directoryInfo.FullName, "IncludeDirective.cs")).ShouldBe(expectedOutput);
            expectedOutput = GetTestResource("ExpectedMultipleFilesContext.MutationQueryBuilder");
            File.ReadAllText(Path.Combine(directoryInfo.FullName, "MutationQueryBuilder.cs")).ShouldBe(expectedOutput);
        }
        finally
        {
            Directory.Delete(directoryInfo.FullName, true);
        }
    }
Ejemplo n.º 13
0
        public static async Task <IReadOnlyCollection <FileInfo> > GenerateClientSourceCode(ProgramOptions options)
        {
            var isServiceUrlMissing = String.IsNullOrWhiteSpace(options.ServiceUrl);

            if (isServiceUrlMissing && String.IsNullOrWhiteSpace(options.SchemaFileName))
            {
                System.Console.WriteLine("ERROR: Either \"serviceUrl\" or \"schemaFileName\" parameter must be specified. ");
                Environment.Exit(4);
            }

            if (!isServiceUrlMissing && !String.IsNullOrWhiteSpace(options.SchemaFileName))
            {
                System.Console.WriteLine("ERROR: \"serviceUrl\" and \"schemaFileName\" parameters are mutually exclusive. ");
                Environment.Exit(5);
            }

            GraphQlSchema schema;

            if (isServiceUrlMissing)
            {
                schema = GraphQlGenerator.DeserializeGraphQlSchema(await File.ReadAllTextAsync(options.SchemaFileName));
            }
            else
            {
                if (!KeyValueParameterParser.TryGetCustomHeaders(options.Headers, out var headers, out var headerParsingErrorMessage))
                {
                    System.Console.WriteLine("ERROR: " + headerParsingErrorMessage);
                    Environment.Exit(3);
                }

                schema = await GraphQlGenerator.RetrieveSchema(options.ServiceUrl, headers);
            }

            var generatorConfiguration =
                new GraphQlGeneratorConfiguration
            {
                CSharpVersion          = options.CSharpVersion,
                ClassPrefix            = options.ClassPrefix,
                ClassSuffix            = options.ClassSuffix,
                GeneratePartialClasses = options.PartialClasses,
                MemberAccessibility    = options.MemberAccessibility,
                IdTypeMapping          = options.IdTypeMapping,
                FloatTypeMapping       = options.FloatTypeMapping,
                JsonPropertyGeneration = options.JsonPropertyAttribute
            };

            if (!KeyValueParameterParser.TryGetCustomClassMapping(options.ClassMapping, out var customMapping, out var customMappingParsingErrorMessage))
            {
                System.Console.WriteLine("ERROR: " + customMappingParsingErrorMessage);
                Environment.Exit(3);
            }

            foreach (var kvp in customMapping)
            {
                generatorConfiguration.CustomClassNameMapping.Add(kvp);
            }

            var generator = new GraphQlGenerator(generatorConfiguration);

            if (options.OutputType == OutputType.SingleFile)
            {
                await File.WriteAllTextAsync(options.OutputPath, generator.GenerateFullClientCSharpFile(schema, options.Namespace));

                return(new[] { new FileInfo(options.OutputPath) });
            }

            var multipleFileGenerationContext = new MultipleFileGenerationContext(schema, options.OutputPath, options.Namespace);

            generator.Generate(multipleFileGenerationContext);
            return(multipleFileGenerationContext.Files);
        }