* Find a literal-valued discriminator property shared by all anyOf variants.
(
variants: JSONSchema7[],
ctx: GoCodegenCtx,
unionTypeName: string
)
| 634 | * Find a literal-valued discriminator property shared by all anyOf variants. |
| 635 | */ |
| 636 | function findGoDiscriminator( |
| 637 | variants: JSONSchema7[], |
| 638 | ctx: GoCodegenCtx, |
| 639 | unionTypeName: string |
| 640 | ): GoDiscriminatorInfo | null { |
| 641 | if (variants.length === 0) return null; |
| 642 | const firstVariant = resolveGoUnionMember(variants[0], ctx.definitions); |
| 643 | if (!firstVariant.properties) return null; |
| 644 | |
| 645 | for (const [propName, propSchema] of Object.entries(firstVariant.properties)) { |
| 646 | if (typeof propSchema !== "object") continue; |
| 647 | const firstDiscriminatorValues = goDiscriminatorValues(propSchema as JSONSchema7, ctx); |
| 648 | if (!firstDiscriminatorValues || firstDiscriminatorValues.values.length === 0) continue; |
| 649 | |
| 650 | const mapping = new Map<GoDiscriminatorValue, GoDiscriminatedUnionVariant[]>(); |
| 651 | const unionVariants: GoDiscriminatedUnionVariant[] = []; |
| 652 | let valid = true; |
| 653 | for (const variantSource of variants) { |
| 654 | const variant = resolveGoUnionMember(variantSource, ctx.definitions); |
| 655 | if (!variant.properties) { valid = false; break; } |
| 656 | if (!(variant.required || []).includes(propName)) { valid = false; break; } |
| 657 | const vp = variant.properties[propName]; |
| 658 | if (typeof vp !== "object") { valid = false; break; } |
| 659 | const discriminatorValues = goDiscriminatorValues(vp as JSONSchema7, ctx); |
| 660 | if (!discriminatorValues || discriminatorValues.values.length === 0 || discriminatorValues.kind !== firstDiscriminatorValues.kind) { valid = false; break; } |
| 661 | const dedupedValues = [...new Set(discriminatorValues.values)]; |
| 662 | if (discriminatorValues.kind === "boolean" && dedupedValues.length > 1) { valid = false; break; } |
| 663 | const unionVariant = { |
| 664 | schema: variant, |
| 665 | typeName: goDiscriminatedUnionVariantTypeName(unionTypeName, dedupedValues[0], variantSource, variant, ctx), |
| 666 | discriminatorValues: dedupedValues, |
| 667 | }; |
| 668 | unionVariants.push(unionVariant); |
| 669 | for (const discriminatorValue of dedupedValues) { |
| 670 | const existing = mapping.get(discriminatorValue) ?? []; |
| 671 | existing.push(unionVariant); |
| 672 | mapping.set(discriminatorValue, existing); |
| 673 | } |
| 674 | } |
| 675 | if (valid && mapping.size > 0 && unionVariants.length === variants.length) { |
| 676 | return { property: propName, valueKind: firstDiscriminatorValues.kind, mapping, variants: unionVariants }; |
| 677 | } |
| 678 | } |
| 679 | return null; |
| 680 | } |
| 681 | |
| 682 | function findGoRequiredFieldDiscriminator( |
| 683 | variants: JSONSchema7[], |
no test coverage detected
searching dependent graphs…