* Generate a polymorphic base class and derived classes for a discriminated union.
(
baseClassName: string,
discriminatorProperty: string,
variants: JSONSchema7[],
knownTypes: Map<string, string>,
nestedClasses: Map<string, string>,
enumOutput: string[],
description?: string,
propertyResolver?: PropertyTypeResolver,
experimental = false,
options: DiscriminatedUnionGenerationOptions = {}
)
| 810 | * Generate a polymorphic base class and derived classes for a discriminated union. |
| 811 | */ |
| 812 | function generatePolymorphicClasses( |
| 813 | baseClassName: string, |
| 814 | discriminatorProperty: string, |
| 815 | variants: JSONSchema7[], |
| 816 | knownTypes: Map<string, string>, |
| 817 | nestedClasses: Map<string, string>, |
| 818 | enumOutput: string[], |
| 819 | description?: string, |
| 820 | propertyResolver?: PropertyTypeResolver, |
| 821 | experimental = false, |
| 822 | options: DiscriminatedUnionGenerationOptions = {} |
| 823 | ): string { |
| 824 | const resolver = propertyResolver ?? resolveSessionPropertyType; |
| 825 | const lines: string[] = []; |
| 826 | const discriminatorInfo = findDiscriminator(variants)!; |
| 827 | const renamedBase = applyTypeRename(baseClassName); |
| 828 | |
| 829 | lines.push(...xmlDocCommentWithFallback(description, `Polymorphic base type discriminated by <c>${escapeXml(discriminatorProperty)}</c>.`, "")); |
| 830 | if (experimental) pushExperimentalAttribute(lines); |
| 831 | lines.push(`[JsonPolymorphic(`); |
| 832 | lines.push(` TypeDiscriminatorPropertyName = "${discriminatorProperty}",`); |
| 833 | lines.push(` UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]`); |
| 834 | |
| 835 | for (const { value } of discriminatorInfo.mapping.values()) { |
| 836 | const constValue = String(value); |
| 837 | const derivedClassName = applyTypeRename(`${baseClassName}${toPascalCase(constValue)}`); |
| 838 | lines.push(`[JsonDerivedType(typeof(${derivedClassName}), "${escapeCSharpStringLiteral(constValue)}")]`); |
| 839 | } |
| 840 | |
| 841 | lines.push(`public partial class ${renamedBase}`); |
| 842 | lines.push(`{`); |
| 843 | lines.push(` /// <summary>The type discriminator.</summary>`); |
| 844 | lines.push(` [JsonPropertyName("${discriminatorProperty}")]`); |
| 845 | lines.push(` public virtual string ${toPascalCase(discriminatorProperty)} { get; set; } = string.Empty;`); |
| 846 | lines.push(`}`); |
| 847 | lines.push(""); |
| 848 | |
| 849 | for (const { value, schema } of discriminatorInfo.mapping.values()) { |
| 850 | const constValue = String(value); |
| 851 | const derivedClassName = applyTypeRename(`${baseClassName}${toPascalCase(constValue)}`); |
| 852 | const derivedCode = generateDerivedClass(derivedClassName, renamedBase, discriminatorProperty, constValue, schema, knownTypes, nestedClasses, enumOutput, resolver, experimental, options); |
| 853 | nestedClasses.set(derivedClassName, derivedCode); |
| 854 | } |
| 855 | |
| 856 | return lines.join("\n"); |
| 857 | } |
| 858 | |
| 859 | /** |
| 860 | * Generate a derived class for a discriminated union variant. |
no test coverage detected
searching dependent graphs…