{{#hasImports}}
{{#oneOfArrays}}
import type { {{{.}}} } from './{{.}}{{importFileExtension}}';
import {
    instanceOf{{{.}}},
    {{{.}}}FromJSON,
    {{{.}}}FromJSONTyped,
    {{{.}}}ToJSON,
} from './{{.}}{{importFileExtension}}';
{{/oneOfArrays}}
{{#oneOfModels}}
import type { {{{.}}} } from './{{.}}{{importFileExtension}}';
import {
    instanceOf{{{.}}},
    {{{.}}}FromJSON,
    {{{.}}}FromJSONTyped,
    {{{.}}}ToJSON,
} from './{{.}}{{importFileExtension}}';
{{/oneOfModels}}

{{/hasImports}}
{{>modelOneOfInterfaces}}


export function {{classname}}FromJSON(json: any): {{classname}} {
    return {{classname}}FromJSONTyped(json, false);
}

export function {{classname}}FromJSONTyped(json: any, ignoreDiscriminator: boolean): {{classname}} {
    if (json == null) {
        return json;
    }
{{#discriminator}}
    switch (json['{{discriminator.propertyBaseName}}']) {
{{#discriminator.mappedModels}}
        case '{{mappingName}}':
            return Object.assign({}, {{modelName}}FromJSONTyped(json, true), { {{discriminator.propertyName}}: '{{mappingName}}' } as const);
{{/discriminator.mappedModels}}
        default:
            return json;
    }
{{/discriminator}}
{{^discriminator}}
    {{#oneOfModels}}
    {{#-first}}
    if (typeof json !== 'object') {
        return json;
    }
    {{/-first}}
    if (instanceOf{{{.}}}(json)) {
        return {{{.}}}FromJSONTyped(json, true);
    }
    {{/oneOfModels}}
    {{#oneOfArrays}}
    {{#-first}}
    if (Array.isArray(json)) {
        if (json.every(item => typeof item === 'object')) {
    {{/-first}}
            if (json.every(item => instanceOf{{{.}}}(item))) {
                return json.map(value => {{{.}}}FromJSONTyped(value, true));
            }
    {{#-last}}
        }
        return json;
    }
    {{/-last}}
    {{/oneOfArrays}}
    {{#oneOfPrimitives}}
    {{#isArray}}
    {{#items}}
    {{#isDateType}}
    if (Array.isArray(json)) {
        if (json.every(item => !(isNaN(new Date(json).getTime()))) {
            return json.map(value => new Date(json);
        }
    }
    {{/isDateType}}
    {{#isDateTimeType}}
    if (Array.isArray(json)) {
        if (json.every(item => !(isNaN(new Date(json).getTime()))) {
            return json.map(value => new Date(json);
        }
    }
    {{/isDateTimeType}}
    {{#isNumeric}}
    if (Array.isArray(json)) {
        if (json.every(item => typeof item === 'number'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return json;
        }
    }
    {{/isNumeric}}
    {{#isBoolean}}
    if (Array.isArray(json)) {
        if (json.every(item => typeof item === 'boolean'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return json;
        }
    }
    {{/isBoolean}}
    {{#isString}}
    if (Array.isArray(json)) {
        if (json.every(item => typeof item === 'string'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === '{{.}}'{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return json;
        }
    }
    {{/isString}}
    {{/items}}
    {{/isArray}}
    {{^isArray}}
    {{#isDateType}}
    if (!(isNaN(new Date(json).getTime()))) {
        return {{^required}}json == null ? undefined : {{/required}}({{#required}}{{#isNullable}}json == null ? null : {{/isNullable}}{{/required}}new Date(json));
    }
    {{/isDateType}}
    {{^isDateType}}
    {{#isDateTimeType}}
    if (!(isNaN(new Date(json).getTime()))) {
        return {{^required}}json == null ? undefined : {{/required}}({{#required}}{{#isNullable}}json == null ? null : {{/isNullable}}{{/required}}new Date(json));
    }
    {{/isDateTimeType}}
    {{/isDateType}}
    {{#isNumeric}}
    if (typeof json === 'number'{{#isEnum}} && ({{#allowableValues}}{{#values}}json === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return json;
    }
    {{/isNumeric}}
    {{#isBoolean}}
    if (typeof json === 'boolean'{{#isEnum}} && ({{#allowableValues}}{{#values}}json === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return json;
    }
    {{/isBoolean}}
    {{#isString}}
    if (typeof json === 'string'{{#isEnum}} && ({{#allowableValues}}{{#values}}json === '{{.}}'{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return json;
    }
    {{/isString}}
    {{/isArray}}
    {{/oneOfPrimitives}}
    return {} as any;
{{/discriminator}}
}

export function {{classname}}ToJSON(json: any): any {
    return {{classname}}ToJSONTyped(json, false);
}

export function {{classname}}ToJSONTyped(value?: {{classname}} | null, ignoreDiscriminator: boolean = false): any {
    if (value == null) {
        return value;
    }
{{#discriminator}}
    switch (value['{{discriminator.propertyName}}']) {
{{#discriminator.mappedModels}}
        case '{{mappingName}}':
            return Object.assign({}, {{modelName}}ToJSON(value), { {{discriminator.propertyName}}: '{{mappingName}}' } as const);
{{/discriminator.mappedModels}}
        default:
            return value;
    }
{{/discriminator}}
{{^discriminator}}
    {{#oneOfModels}}
    {{#-first}}
    if (typeof value !== 'object') {
        return value;
    }
    {{/-first}}
    if (instanceOf{{{.}}}(value)) {
        return {{{.}}}ToJSON(value as {{{.}}});
    }
    {{/oneOfModels}}
    {{#oneOfArrays}}
    {{#-first}}
    if (Array.isArray(value)) {
        if (value.every(item => typeof item === 'object')) {
    {{/-first}}
            if (value.every(item => instanceOf{{{.}}}(item))) {
                return value.map(value => {{{.}}}ToJSON(value as {{{.}}}));
            }
    {{#-last}}
        }
        return value;
    }
    {{/-last}}
    {{/oneOfArrays}}
    {{#oneOfPrimitives}}
    {{#isArray}}
    {{#items}}
    {{#isDateType}}
    if (Array.isArray(value)) {
        if (value.every(item => item instanceof Date) {
            return value.map(value => value.toISOString().substring(0,10)));
        }
    }
    {{/isDateType}}
    {{#isDateTimeType}}
    if (Array.isArray(value)) {
        if (value.every(item => item instanceof Date) {
            return value.map(value => value.toISOString();
        }
    }
    {{/isDateTimeType}}
    {{#isNumeric}}
    if (Array.isArray(value)) {
        if (value.every(item => typeof item === 'number'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return value;
        }
    }
    {{/isNumeric}}
    {{#isBoolean}}
    if (Array.isArray(value)) {
        if (value.every(item => typeof item === 'boolean'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return value;
        }
    }
    {{/isBoolean}}
    {{#isString}}
    if (Array.isArray(value)) {
        if (value.every(item => typeof item === 'string'{{#isEnum}} && ({{#allowableValues}}{{#values}}item === '{{.}}'{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}})) {
            return value;
        }
    }
    {{/isString}}
    {{/items}}
    {{/isArray}}
    {{^isArray}}
    {{#isDateType}}
    if (value instanceof Date) {
        return ((value{{#isNullable}} as any{{/isNullable}}){{^required}}{{#isNullable}}?{{/isNullable}}{{/required}}.toISOString().substring(0,10));
    }
    {{/isDateType}}
    {{#isDateTimeType}}
    if (value instanceof Date) {
        return {{^required}}{{#isNullable}}value === null ? null : {{/isNullable}}{{^isNullable}}value == null ? undefined : {{/isNullable}}{{/required}}((value{{#isNullable}} as any{{/isNullable}}){{^required}}{{#isNullable}}?{{/isNullable}}{{/required}}.toISOString());
    }
    {{/isDateTimeType}}
    {{#isNumeric}}
    if (typeof value === 'number'{{#isEnum}} && ({{#allowableValues}}{{#values}}value === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return value;
    }
    {{/isNumeric}}
    {{#isBoolean}}
    if (typeof value === 'boolean'{{#isEnum}} && ({{#allowableValues}}{{#values}}value === {{.}}{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return value;
    }
    {{/isBoolean}}
    {{#isString}}
    if (typeof value === 'string'{{#isEnum}} && ({{#allowableValues}}{{#values}}value === '{{.}}'{{^-last}} || {{/-last}}{{/values}}{{/allowableValues}}){{/isEnum}}) {
        return value;
    }
    {{/isString}}
    {{/isArray}}
    {{/oneOfPrimitives}}
    return {};
{{/discriminator}}
}
