* Find a discriminator property shared by all variants in an anyOf.
(variants: JSONSchema7[])
| 666 | * Find a discriminator property shared by all variants in an anyOf. |
| 667 | */ |
| 668 | function findDiscriminator(variants: JSONSchema7[]): DiscriminatorInfo | null { |
| 669 | if (variants.length === 0) return null; |
| 670 | const firstVariant = variants[0]; |
| 671 | if (!firstVariant.properties) return null; |
| 672 | |
| 673 | for (const [propName, propSchema] of Object.entries(firstVariant.properties).sort(([a], [b]) => a.localeCompare(b))) { |
| 674 | if (typeof propSchema !== "object") continue; |
| 675 | const schema = propSchema as JSONSchema7; |
| 676 | if (schema.const === undefined) continue; |
| 677 | |
| 678 | const mapping = new Map<string, DiscriminatorVariant>(); |
| 679 | let isValidDiscriminator = true; |
| 680 | |
| 681 | for (const variant of variants) { |
| 682 | if (!variant.properties) { isValidDiscriminator = false; break; } |
| 683 | const variantProp = variant.properties[propName]; |
| 684 | if (typeof variantProp !== "object") { isValidDiscriminator = false; break; } |
| 685 | const variantSchema = variantProp as JSONSchema7; |
| 686 | if (variantSchema.const === undefined) { isValidDiscriminator = false; break; } |
| 687 | const key = String(variantSchema.const); |
| 688 | if (mapping.has(key)) { isValidDiscriminator = false; break; } |
| 689 | mapping.set(key, { value: variantSchema.const, schema: variant }); |
| 690 | } |
| 691 | |
| 692 | if (isValidDiscriminator && mapping.size === variants.length) { |
| 693 | return { property: propName, mapping }; |
| 694 | } |
| 695 | } |
| 696 | return null; |
| 697 | } |
| 698 | |
| 699 | /** Callback that resolves the C# type for a property schema within a polymorphic class. */ |
| 700 | type PropertyTypeResolver = ( |
no test coverage detected
searching dependent graphs…