﻿//----------------------
// <auto-generated>
// </auto-generated>
//----------------------







export class Animal implements IAnimal {
    foo!: string | undefined;

    protected _discriminator: string;

    constructor(data?: IAnimal) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
        this._discriminator = "Animal";
    }

    init(_data?: any) {
        if (_data) {
            this.foo = _data["Foo"];
        }
    }

    static fromJS(data: any): Animal {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "Dog") {
            let result = new Dog();
            result.init(data);
            return result;
        }
        let result = new Animal();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["discriminator"] = this._discriminator;
        data["Foo"] = this.foo;
        return data;
    }
}

export interface IAnimal {
    foo: string | undefined;
}

export class Dog extends Animal implements IDog {
    bar!: string | undefined;
    subElements!: SubClass[] | undefined;

    constructor(data?: IDog) {
        super(data);
        this._discriminator = "Dog";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.bar = _data["Bar"];
            if (Array.isArray(_data["SubElements"])) {
                this.subElements = [] as any;
                for (let item of _data["SubElements"])
                    this.subElements!.push(SubClass.fromJS(item));
            }
        }
    }

    static override fromJS(data: any): Dog {
        data = typeof data === 'object' ? data : {};
        let result = new Dog();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Bar"] = this.bar;
        if (Array.isArray(this.subElements)) {
            data["SubElements"] = [];
            for (let item of this.subElements)
                data["SubElements"].push(item ? item.toJSON() : undefined as any);
        }
        super.toJSON(data);
        return data;
    }
}

export interface IDog extends IAnimal {
    bar: string | undefined;
    subElements: SubClass[] | undefined;
}

export class SubClass implements ISubClass {

    protected _discriminator: string;

    constructor(data?: ISubClass) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
        this._discriminator = "SubClass";
    }

    init(_data?: any) {
    }

    static fromJS(data: any): SubClass {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "SubClass1") {
            let result = new SubClass1();
            result.init(data);
            return result;
        }
        if (data["discriminator"] === "SubClass2") {
            let result = new SubClass2();
            result.init(data);
            return result;
        }
        if (data["discriminator"] === "SubClass3") {
            let result = new SubClass3();
            result.init(data);
            return result;
        }
        let result = new SubClass();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["discriminator"] = this._discriminator;
        return data;
    }
}

export interface ISubClass {
}

export class SubClass1 extends SubClass implements ISubClass1 {
    prop1!: string | undefined;

    constructor(data?: ISubClass1) {
        super(data);
        this._discriminator = "SubClass1";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.prop1 = _data["Prop1"];
        }
    }

    static override fromJS(data: any): SubClass1 {
        data = typeof data === 'object' ? data : {};
        let result = new SubClass1();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Prop1"] = this.prop1;
        super.toJSON(data);
        return data;
    }
}

export interface ISubClass1 extends ISubClass {
    prop1: string | undefined;
}

export class SubClass2 extends SubClass implements ISubClass2 {
    prop2!: string | undefined;

    constructor(data?: ISubClass2) {
        super(data);
        this._discriminator = "SubClass2";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.prop2 = _data["Prop2"];
        }
    }

    static override fromJS(data: any): SubClass2 {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "SubClass3") {
            let result = new SubClass3();
            result.init(data);
            return result;
        }
        let result = new SubClass2();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Prop2"] = this.prop2;
        super.toJSON(data);
        return data;
    }
}

export interface ISubClass2 extends ISubClass {
    prop2: string | undefined;
}

export class SubClass3 extends SubClass2 implements ISubClass3 {
    prop3!: string | undefined;

    constructor(data?: ISubClass3) {
        super(data);
        this._discriminator = "SubClass3";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.prop3 = _data["Prop3"];
        }
    }

    static override fromJS(data: any): SubClass3 {
        data = typeof data === 'object' ? data : {};
        let result = new SubClass3();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Prop3"] = this.prop3;
        super.toJSON(data);
        return data;
    }
}

export interface ISubClass3 extends ISubClass2 {
    prop3: string | undefined;
}

export class Container implements IContainer {
    animal!: Animal | undefined;

    constructor(data?: IContainer) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.animal = _data["Animal"] ? Animal.fromJS(_data["Animal"]) : undefined as any;
        }
    }

    static fromJS(data: any): Container {
        data = typeof data === 'object' ? data : {};
        let result = new Container();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Animal"] = this.animal ? this.animal.toJSON() : undefined as any;
        return data;
    }
}

export interface IContainer {
    animal: Animal | undefined;
}