protected override async Task WriteAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("public class ").ConfigureAwait(false);

            await writer.WriteAsync(descriptor.Name).ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteLeftBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                for (int i = 0; i < descriptor.Fields.Count; i++)
                {
                    IInputFieldDescriptor fieldDescriptor = descriptor.Fields[i];

                    string typeName = typeLookup.GetTypeName(
                        fieldDescriptor.Type,
                        fieldDescriptor.InputObjectType?.Name,
                        false);

                    if (i > 0)
                    {
                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }

                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync($"public Optional<{typeName}>")
                    .ConfigureAwait(false);

                    await writer.WriteSpaceAsync().ConfigureAwait(false);

                    await writer.WriteAsync(GetPropertyName(fieldDescriptor.Name))
                    .ConfigureAwait(false);

                    await writer.WriteSpaceAsync().ConfigureAwait(false);

                    await writer.WriteAsync("{ get; set; }").ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteRightBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
Exemple #2
0
        private static async Task WriteInitializationAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor)
        {
            var serializers = new HashSet <string>();

            await writer.WriteIndentedLineAsync(
                "public void Initialize(IValueSerializerCollection serializerResolver)")
            .ConfigureAwait(false);

            await writer.WriteIndentedLineAsync("{").ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentedLineAsync("if (serializerResolver is null)")
                .ConfigureAwait(false);

                await writer.WriteIndentedLineAsync("{").ConfigureAwait(false);

                using (writer.IncreaseIndent())
                {
                    await writer.WriteIndentedLineAsync(
                        "throw new ArgumentNullException(nameof(serializerResolver));")
                    .ConfigureAwait(false);
                }
                await writer.WriteIndentedLineAsync("}").ConfigureAwait(false);

                for (int i = 0; i < descriptor.Fields.Count; i++)
                {
                    IInputFieldDescriptor field = descriptor.Fields[i];

                    string typeName = field.InputObjectType is null
                        ? field.Type.NamedType().Name.Value
                        : field.InputObjectType.Name;

                    if (serializers.Add(typeName))
                    {
                        await writer.WriteIndentAsync().ConfigureAwait(false);

                        await writer.WriteAsync('_').ConfigureAwait(false);

                        await writer.WriteAsync(GetFieldName(typeName)).ConfigureAwait(false);

                        await writer.WriteAsync("Serializer = ").ConfigureAwait(false);

                        await writer.WriteAsync(
                            $"serializerResolver.Get(\"{typeName}\");")
                        .ConfigureAwait(false);

                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }
                }
                await writer.WriteIndentedLineAsync("_needsInitialization = false;")
                .ConfigureAwait(false);
            }

            await writer.WriteIndentedLineAsync("}").ConfigureAwait(false);
        }
Exemple #3
0
        private async Task WriteConstructorAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor)
        {
            await writer.WriteIndentAsync();

            await writer.WriteAsync("public ");

            await writer.WriteAsync(descriptor.Name);

            await writer.WriteAsync("Serializer");

            await writer.WriteAsync("(IEnumerable<IValueSerializer> serializers)");

            await writer.WriteLineAsync();

            await writer.WriteIndentAsync();

            await writer.WriteAsync('{');

            await writer.WriteLineAsync();

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentAsync();

                await writer.WriteAsync("IReadOnlyDictionary<string, IValueSerializer> map = ");

                await writer.WriteAsync("serializers.ToDictionary();");

                await writer.WriteLineAsync();

                for (int i = 0; i < descriptor.Fields.Count; i++)
                {
                    IInputFieldDescriptor field = descriptor.Fields[i];

                    string typeName = field.InputObjectType is null
                        ? field.Type.NamedType().Name.Value
                        : field.InputObjectType.Name;

                    string serializerType = i == 0
                        ? "IValueSerializer "
                        : string.Empty;

                    await writer.WriteLineAsync();

                    await writer.WriteIndentAsync();

                    await writer.WriteAsync(
                        "if (!map.TryGetValue" +
                        $"(\"{typeName}\", out {serializerType}serializer))");

                    await writer.WriteLineAsync();

                    await writer.WriteIndentAsync();

                    await writer.WriteAsync('{');

                    await writer.WriteLineAsync();

                    using (writer.IncreaseIndent())
                    {
                        await writer.WriteIndentAsync();

                        await writer.WriteAsync("throw new ArgumentException(");

                        await writer.WriteLineAsync();

                        using (writer.IncreaseIndent())
                        {
                            await writer.WriteIndentAsync();

                            await writer.WriteAsync(
                                "\"There is no serializer specified for " +
                                $"`{typeName}`.\",");

                            await writer.WriteLineAsync();

                            await writer.WriteIndentAsync();

                            await writer.WriteAsync("nameof(serializers));");

                            await writer.WriteLineAsync();
                        }
                    }

                    await writer.WriteIndentAsync();

                    await writer.WriteAsync('}');

                    await writer.WriteLineAsync();

                    await writer.WriteIndentAsync();

                    await writer.WriteAsync('_');

                    await writer.WriteAsync(GetFieldName(typeName));

                    await writer.WriteAsync("Serializer = serializer;");

                    await writer.WriteLineAsync();
                }
            }

            await writer.WriteIndentAsync();

            await writer.WriteAsync('}');

            await writer.WriteLineAsync();
        }