* Generate a polymorphic base class and variant subclasses for a discriminated union result type.
(
className: string,
schema: JSONSchema7,
packageName: string,
packageDir: string
)
| 320 | * Generate a polymorphic base class and variant subclasses for a discriminated union result type. |
| 321 | */ |
| 322 | async function generatePolymorphicResultClass( |
| 323 | className: string, |
| 324 | schema: JSONSchema7, |
| 325 | packageName: string, |
| 326 | packageDir: string |
| 327 | ): Promise<void> { |
| 328 | const anyOf = schema.anyOf as JSONSchema7[]; |
| 329 | const variants = resolveAnyOfVariants(anyOf); |
| 330 | const discriminator = findDiscriminator(variants); |
| 331 | |
| 332 | if (!discriminator) { |
| 333 | console.warn(`[codegen] Cannot find discriminator for ${className} — skipping polymorphic generation`); |
| 334 | return; |
| 335 | } |
| 336 | |
| 337 | // Collect variant info |
| 338 | interface VariantInfo { |
| 339 | discriminatorValue: string; |
| 340 | variantClassName: string; |
| 341 | schema: JSONSchema7; |
| 342 | } |
| 343 | |
| 344 | const variantInfos: VariantInfo[] = []; |
| 345 | for (const [discValue, { schema: variantSchema }] of discriminator.mapping) { |
| 346 | const variantClassName = (variantSchema as JSONSchema7 & { title?: string }).title ?? `${className}${toPascalCase(discValue)}`; |
| 347 | variantInfos.push({ discriminatorValue: discValue, variantClassName, schema: variantSchema }); |
| 348 | } |
| 349 | |
| 350 | // Generate the abstract base class |
| 351 | const baseLines: string[] = []; |
| 352 | baseLines.push(COPYRIGHT); |
| 353 | baseLines.push(""); |
| 354 | baseLines.push(AUTO_GENERATED_HEADER); |
| 355 | baseLines.push(GENERATED_FROM_API); |
| 356 | baseLines.push(""); |
| 357 | baseLines.push(`package ${packageName};`); |
| 358 | baseLines.push(""); |
| 359 | baseLines.push(`import com.fasterxml.jackson.annotation.JsonIgnoreProperties;`); |
| 360 | baseLines.push(`import com.fasterxml.jackson.annotation.JsonSubTypes;`); |
| 361 | baseLines.push(`import com.fasterxml.jackson.annotation.JsonTypeInfo;`); |
| 362 | baseLines.push(`import javax.annotation.processing.Generated;`); |
| 363 | baseLines.push(""); |
| 364 | if (schema.description) { |
| 365 | baseLines.push(`/**`); |
| 366 | baseLines.push(` * ${schema.description}`); |
| 367 | baseLines.push(` *`); |
| 368 | baseLines.push(` * @since 1.0.0`); |
| 369 | baseLines.push(` */`); |
| 370 | } |
| 371 | baseLines.push(`@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "${discriminator.property}", visible = true)`); |
| 372 | baseLines.push(`@JsonSubTypes({`); |
| 373 | for (let i = 0; i < variantInfos.length; i++) { |
| 374 | const v = variantInfos[i]; |
| 375 | const comma = i < variantInfos.length - 1 ? "," : ""; |
| 376 | baseLines.push(` @JsonSubTypes.Type(value = ${v.variantClassName}.class, name = "${v.discriminatorValue}")${comma}`); |
| 377 | } |
| 378 | baseLines.push(`})`); |
| 379 | baseLines.push(`@JsonIgnoreProperties(ignoreUnknown = true)`); |
no test coverage detected
searching dependent graphs…