public EnumBuilder ProcessEnumType(OpenApiSchema jsonType, string @namespace, string jsonTypeName, string typeName, string typeDescription)
        {
            string jsonFormat = jsonType.Format;

            bool isFlags = jsonType.Extensions.TryGetValue("x-enum-is-bitmask", out var isFlagsTemp) && isFlagsTemp is OpenApiBoolean isFlagsBoolean && isFlagsBoolean.Value;

            EnumBuilder enumBuilder = new EnumBuilder();

            enumBuilder.Namespace      = @namespace;
            enumBuilder.Name           = typeName;
            enumBuilder.JsonName       = jsonTypeName;
            enumBuilder.Description    = typeDescription;
            enumBuilder.UnderlyingType = GetEnumUnderlyingType(jsonFormat);
            enumBuilder.IsFlags        = isFlags;

            ProcessEnumFields(jsonType, enumBuilder);

            return(enumBuilder);
        }
        private void ProcessEnumFields(OpenApiSchema jsonType, EnumBuilder enumBuilder)
        {
            var jsonEnumValues = (OpenApiArray)jsonType.Extensions["x-enum-values"];

            foreach (OpenApiObject jsonEnumValue in jsonEnumValues)
            {
                var jsonIdentifier   = (OpenApiString)jsonEnumValue["identifier"];
                var jsonNumericValue = jsonEnumValue["numericValue"];
                jsonEnumValue.TryGetValue("description", out var jsonMemberDescription);

                var enumFieldBuilder = new EnumFieldBuilder();
                enumFieldBuilder.Name     = jsonIdentifier.Value;
                enumFieldBuilder.JsonName = jsonIdentifier.Value;

                if (jsonNumericValue is OpenApiLong longValue)
                {
                    enumFieldBuilder.NumericValue = longValue.Value.ToString();
                }
                if (jsonNumericValue is OpenApiInteger integerValue)
                {
                    enumFieldBuilder.NumericValue = integerValue.Value.ToString();
                }
                if (jsonNumericValue is OpenApiByte byteValue)
                {
                    enumFieldBuilder.NumericValue = byteValue.Value.ToString();
                }
                if (jsonNumericValue is OpenApiString stringValue)
                {
                    enumFieldBuilder.NumericValue = stringValue.Value;
                }

                if (jsonMemberDescription != null)
                {
                    enumFieldBuilder.Description = ((OpenApiString)jsonMemberDescription).Value;
                }

                enumBuilder.Fields.Add(enumFieldBuilder);
            }
        }
        private void ResolveJsonPathTypeReferences()
        {
            List <(string, TypeBuilder)> fallbackTypes = new List <(string, TypeBuilder)>();

            foreach (var typeBuilder in _generatedTypes.Values)
            {
                if (typeBuilder is ClassBuilder classBuilder)
                {
                    foreach (var propertyBuilder in classBuilder.Properties)
                    {
                        if (propertyBuilder.Type.IsJsonPath)
                        {
                            if (!_generatedTypes.TryGetValue(propertyBuilder.Type.JsonPath, out TypeBuilder newTypeBuilder))
                            {
                                throw new Exception($"Type '{typeBuilder.Name}' has property '{propertyBuilder.Name}' with reference to unknown type '{propertyBuilder.Type.JsonPath}'.");
                            }

                            propertyBuilder.Type = newTypeBuilder;
                        }
                        else if (propertyBuilder.Type.IsTypeBuilder)
                        {
                            if (propertyBuilder.Type.TypeBuilder is NullableEnumBuilder nullableEnumBuilder)
                            {
                                if (nullableEnumBuilder.EnumBuilder is AnonymousEnumBuilder anonEnumBuilder)
                                {
                                    EnumBuilder enumBuilder = FindMatchingEnumBuilder(anonEnumBuilder);
                                    if (enumBuilder is null)
                                    {
                                        enumBuilder = new EnumBuilder()
                                        {
                                            Name           = propertyBuilder.Name,
                                            JsonName       = propertyBuilder.JsonName,
                                            Description    = nullableEnumBuilder.Description,
                                            Namespace      = "",
                                            IsFlags        = anonEnumBuilder.IsFlags,
                                            UnderlyingType = anonEnumBuilder.UnderlyingType
                                        };
                                        enumBuilder.Fields.AddRange(anonEnumBuilder.Fields);

                                        fallbackTypes.Add((TypeReference.ComponentsSchemasRootPath + enumBuilder.Name, enumBuilder));
                                    }
                                    propertyBuilder.Type = new NullableEnumBuilder()
                                    {
                                        EnumBuilder = enumBuilder
                                    };
                                }
                                else
                                {
                                    // OOPS!
                                }
                            }
                            else if (typeBuilder is AnonymousEnumBuilder anonEnumBuilder)
                            {
                                EnumBuilder enumBuilder = FindMatchingEnumBuilder(anonEnumBuilder);
                                if (enumBuilder is null)
                                {
                                    enumBuilder = new EnumBuilder()
                                    {
                                        Name           = propertyBuilder.Name,
                                        JsonName       = propertyBuilder.JsonName,
                                        Description    = typeBuilder.Description,
                                        Namespace      = "",
                                        IsFlags        = anonEnumBuilder.IsFlags,
                                        UnderlyingType = anonEnumBuilder.UnderlyingType
                                    };
                                    enumBuilder.Fields.AddRange(anonEnumBuilder.Fields);

                                    fallbackTypes.Add((TypeReference.ComponentsSchemasRootPath + enumBuilder.Name, enumBuilder));
                                }
                                propertyBuilder.Type = enumBuilder;
                            }
                            else
                            {
                                // OOPS!
                            }
                        }
                        else
                        {
                            // OOPS!
                        }
                    }

                    if (typeBuilder is DictionaryBuilder dictionaryBuilder)
                    {
                        if (dictionaryBuilder.KeyType.IsJsonPath)
                        {
                            if (!_generatedTypes.TryGetValue(dictionaryBuilder.KeyType.JsonPath, out TypeBuilder newTypeBuilder))
                            {
                                throw new Exception($"Type '{typeBuilder.Name}' has property '{dictionaryBuilder.KeyType.Name}' with reference to unknown type '{dictionaryBuilder.KeyType.JsonPath}'.");
                            }

                            dictionaryBuilder.KeyType = newTypeBuilder;
                        }
                        else if (typeBuilder is AnonymousEnumBuilder anonEnumBuilder)
                        {
                        }

                        if (dictionaryBuilder.ItemType.IsJsonPath)
                        {
                            if (!_generatedTypes.TryGetValue(dictionaryBuilder.ItemType.JsonPath, out TypeBuilder newTypeBuilder))
                            {
                                throw new Exception($"Type '{typeBuilder.Name}' has property '{dictionaryBuilder.ItemType.Name}' with reference to unknown type '{dictionaryBuilder.ItemType.JsonPath}'.");
                            }

                            dictionaryBuilder.ItemType = newTypeBuilder;
                        }
                        else if (typeBuilder is AnonymousEnumBuilder anonEnumBuilder)
                        {
                        }
                    }
                }
                else if (typeBuilder is ArrayBuilder arrayBuilder)
                {
                    if (arrayBuilder.ElementType.IsJsonPath)
                    {
                        if (!_generatedTypes.TryGetValue(arrayBuilder.ElementType.JsonPath, out TypeBuilder newTypeBuilder))
                        {
                            throw new Exception($"Type '{typeBuilder.Name}' has property '{arrayBuilder.ElementType.Name}' with reference to unknown type '{arrayBuilder.ElementType.JsonPath}'.");
                        }

                        arrayBuilder.ElementType = newTypeBuilder;
                    }
                }
            }

            foreach (var(name, builder) in fallbackTypes)
            {
                _generatedTypes.Add(name, builder);
            }
        }