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); } }