private OpenApiSchema GeneratePropertySchema( JsonProperty jsonProperty, MemberInfo memberInfo, object[] attributes, SchemaRepository schemaRepository) { var schema = RootGenerator.GenerateSchema(jsonProperty.PropertyType, schemaRepository); schema.WriteOnly = jsonProperty.Writable && !jsonProperty.Readable; schema.ReadOnly = jsonProperty.Readable && !jsonProperty.Writable; foreach (var attribute in attributes) { if (attribute is DefaultValueAttribute defaultValue) { schema.Default = OpenApiAnyFactory.TryCreateFor(schema, defaultValue.Value, out IOpenApiAny openApiAny) ? openApiAny : schema.Default; } else if (attribute is RegularExpressionAttribute regex) { schema.Pattern = regex.Pattern; } else if (attribute is RangeAttribute range) { schema.Maximum = decimal.TryParse(range.Maximum.ToString(), out decimal maximum) ? maximum : schema.Maximum; schema.Minimum = decimal.TryParse(range.Minimum.ToString(), out decimal minimum) ? minimum : schema.Minimum; } else if (attribute is MinLengthAttribute minLength) { schema.MinLength = minLength.Length; } else if (attribute is MaxLengthAttribute maxLength) { schema.MaxLength = maxLength.Length; } else if (attribute is StringLengthAttribute stringLength) { schema.MinLength = stringLength.MinimumLength; schema.MaxLength = stringLength.MaximumLength; } else if (attribute is EmailAddressAttribute) { schema.Format = "email"; } else if (attribute is CreditCardAttribute) { schema.Format = "credit-card"; } else if (attribute is PhoneAttribute) { schema.Format = "tel"; } else if (attribute is DataTypeAttribute dataTypeAttribute && schema.Type == "string") { schema.Format = DataTypeFormatMap.TryGetValue(dataTypeAttribute.DataType, out string format) ? format : schema.Format; } } return(schema); }