private static string ScalarToNetType(GraphQlType baseType, string valueName, GraphQlTypeBase valueType)
        {
            switch (valueType.Name)
            {
            case GraphQlTypeBase.GraphQlTypeScalarInteger:
                return("int?");

            case GraphQlTypeBase.GraphQlTypeScalarByte:
                return("byte?");

            case GraphQlTypeBase.GraphQlTypeScalarString:
                return(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, valueType, valueName));

            case GraphQlTypeBase.GraphQlTypeScalarFloat:
                return("decimal?");

            case GraphQlTypeBase.GraphQlTypeScalarBoolean:
                return("bool?");

            case GraphQlTypeBase.GraphQlTypeScalarId:
                return("Guid?");

            case GraphQlTypeBase.GraphQlTypeScalarDateTime:
                return("DateTime?");

            default:
                return(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, valueType, valueName));
            }
        }
Beispiel #2
0
        private static string GetDataPropertyType(GraphQlType baseType, IGraphQlMember member)
        {
            string propertyType;
            var    fieldType = member.Type.UnwrapIfNonNull();

            switch (fieldType.Kind)
            {
            case GraphQlTypeKind.Object:
            case GraphQlTypeKind.Interface:
            case GraphQlTypeKind.Union:
            case GraphQlTypeKind.InputObject:
                var fieldTypeName = fieldType.Name;
                fieldTypeName = UseCustomClassNameIfDefined(fieldTypeName);
                propertyType  = $"{fieldTypeName}{GraphQlGeneratorConfiguration.ClassPostfix}";
                return(AddQuestionMarkIfNullableReferencesEnabled(propertyType));

            case GraphQlTypeKind.Enum:
                return(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, member.Type, member.Name));

            case GraphQlTypeKind.List:
                var itemTypeName = fieldType.OfType.UnwrapIfNonNull().Name;
                itemTypeName = UseCustomClassNameIfDefined(itemTypeName);
                var itemType         = IsUnknownObjectScalar(baseType, member.Name, fieldType.OfType) ? "object" : $"{itemTypeName}{GraphQlGeneratorConfiguration.ClassPostfix}";
                var suggestedNetType = ScalarToNetType(baseType, member.Name, fieldType.OfType).TrimEnd('?');
                if (!String.Equals(suggestedNetType, "object") && !String.Equals(suggestedNetType, "object?") && !suggestedNetType.TrimEnd().EndsWith("System.Object") && !suggestedNetType.TrimEnd().EndsWith("System.Object?"))
                {
                    itemType = suggestedNetType;
                }

                propertyType = $"ICollection<{itemType}>";

                return(AddQuestionMarkIfNullableReferencesEnabled(propertyType));

            case GraphQlTypeKind.Scalar:
                switch (fieldType.Name)
                {
                case GraphQlTypeBase.GraphQlTypeScalarInteger:
                    return(GetIntegerNetType(baseType, member.Type, member.Name));

                case GraphQlTypeBase.GraphQlTypeScalarString:
                    return(GetCustomScalarType(baseType, member.Type, member.Name));

                case GraphQlTypeBase.GraphQlTypeScalarFloat:
                    return(GetFloatNetType(baseType, member.Type, member.Name));

                case GraphQlTypeBase.GraphQlTypeScalarBoolean:
                    return(GetBooleanNetType(baseType, member.Type, member.Name));

                case GraphQlTypeBase.GraphQlTypeScalarId:
                    return(GetIdNetType(baseType, member.Type, member.Name));

                default:
                    return(GetCustomScalarType(baseType, member.Type, member.Name));
                }

            default:
                return(AddQuestionMarkIfNullableReferencesEnabled("string"));
            }
        }
        private static string GetIdNetType(GraphQlType baseType, GraphQlTypeBase valueType, string valueName)
        {
            switch (GraphQlGeneratorConfiguration.IdType)
            {
            case IdType.String: return("string");

            case IdType.Guid: return("Guid?");

            case IdType.Object: return("object");

            case IdType.Custom: return(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, valueType, valueName));

            default: throw new InvalidOperationException($"'{GraphQlGeneratorConfiguration.IdType}' not supported");
            }
        }
        private static string GetCustomScalarType(GraphQlType baseType, GraphQlTypeBase valueType, string valueName)
        {
            if (GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping == null)
            {
                throw new InvalidOperationException($"'{nameof(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping)}' missing");
            }

            var netType = GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, valueType, valueName);

            if (String.IsNullOrWhiteSpace(netType))
            {
                throw new InvalidOperationException($".NET type for '{baseType.Name}.{valueName}' ({valueType.Name}) cannot be resolved. Please check {nameof(GraphQlGeneratorConfiguration)}.{nameof(GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping)} implementation. ");
            }

            return(netType);
        }
        private static void GenerateDataProperty(GraphQlType baseType, IGraphQlMember member, bool isDeprecated, string deprecationReason, StringBuilder builder)
        {
            var propertyName = NamingHelper.ToPascalCase(member.Name);

            string propertyType;
            var    fieldType = UnwrapNonNull(member.Type);

            switch (fieldType.Kind)
            {
            case GraphQlTypeKindObject:
                propertyType = $"{fieldType.Name}{GraphQlGeneratorConfiguration.ClassPostfix}";
                break;

            case GraphQlTypeKindEnum:
                propertyType = $"{fieldType.Name}?";
                break;

            case GraphQlTypeKindList:
                var itemType         = IsObjectScalar(fieldType.OfType) ? "object" : $"{UnwrapNonNull(fieldType.OfType).Name}{GraphQlGeneratorConfiguration.ClassPostfix}";
                var suggestedNetType = ScalarToNetType(baseType, member.Name, UnwrapNonNull(fieldType.OfType)).TrimEnd('?');
                if (!String.Equals(suggestedNetType, "object"))
                {
                    itemType = suggestedNetType;
                }

                propertyType = $"ICollection<{itemType}>";
                break;

            case GraphQlTypeKindScalar:
                switch (fieldType.Name)
                {
                case "Int":
                    propertyType = "int?";
                    break;

                case "Byte":
                    propertyType = "byte?";
                    break;

                case "String":
                    propertyType = GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, fieldType, member.Name);
                    break;

                case "Float":
                    propertyType = "decimal?";
                    break;

                case "Boolean":
                    propertyType = "bool?";
                    break;

                case "ID":
                    propertyType = "Guid?";
                    break;

                case "DateTime":
                    propertyType = "DateTime?";
                    break;

                default:
                    propertyType = GraphQlGeneratorConfiguration.CustomScalarFieldTypeMapping(baseType, fieldType, member.Name);
                    break;
                }

                break;

            default:
                propertyType = "string";
                break;
            }

            GenerateCodeComments(builder, member.Description);

            if (isDeprecated)
            {
                deprecationReason = String.IsNullOrWhiteSpace(deprecationReason) ? null : $"(@\"{deprecationReason.Replace("\"", "\"\"")}\")";
                builder.AppendLine($"    [Obsolete{deprecationReason}]");
            }

            builder.AppendLine($"    public {propertyType} {propertyName} {{ get; set; }}");
        }