papsign/Ktor-OpenAPI-Generator

OneOf Subtyping - Generators were failing to generate proper discriminators

Closed this issue · 3 comments

Tested on generators:

  • TypeScript
  • TypeScript-fetch

Given:

  • User is using subTypes to create polymorphic ode

Whe:

  • Code is generated

Then

  • Discriminators are not taken into account

Should:

  • Code should be discriminators aware

Old behavior:
Generated code with discriminators not compiling
image

No discriminators:


export class Base {
    'str': string;
    'i': number;

    static readonly discriminator: string | undefined = undefined;

    static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [
        {
            "name": "str",
            "baseName": "str",
            "type": "string",
            "format": ""
        },
        {
            "name": "i",
            "baseName": "i",
            "type": "number",
            "format": "int32"
        }    ];

    static getAttributeTypeMap() {
        return Base.attributeTypeMap;
    }
    
    public constructor() {
    }
}

export class A {
    'str': string;

    static readonly discriminator: string | undefined = undefined;

    static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [
        {
            "name": "str",
            "baseName": "str",
            "type": "string",
            "format": ""
        }    ];

    static getAttributeTypeMap() {
        return A.attributeTypeMap;
    }
    
    public constructor() {
    }
}


Expected Behavior (current):


export class Base {
    'type'?: string;
    'i': number;
    'l': number;

    static readonly discriminator: string | undefined = "type";

    static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [
        {
            "name": "type",
            "baseName": "type",
            "type": "string",
            "format": "string"
        },
        {
            "name": "i",
            "baseName": "i",
            "type": "number",
            "format": "int32"
        },
        {
            "name": "l",
            "baseName": "l",
            "type": "number",
            "format": "int64"
        }    ];

    static getAttributeTypeMap() {
        return Base.attributeTypeMap;
    }
    
    public constructor() {
        this.type = "Base";
    }
}


export class B {
    'i': number;
    'type'?: string;

    static readonly discriminator: string | undefined = "type";

    static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [
        {
            "name": "i",
            "baseName": "i",
            "type": "number",
            "format": "int32"
        },
        {
            "name": "type",
            "baseName": "type",
            "type": "string",
            "format": "string"
        }    ];

    static getAttributeTypeMap() {
        return B.attributeTypeMap;
    }
    
    public constructor() {
        this.type = "B";
    }
}

#90

PR Accepted

@Wicpar Thanks, is that possible to generate beta build from that?

Yes I'm waiting for another pr though