/* tslint:disable */
/* eslint-disable */
/**
 * CWMS Data API
 * CWMS REST API for Data Retrieval
 *
 * The version of the OpenAPI document: 2.4.0-2026.3.16
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

import {
    ExpressionRating,
    ExpressionRatingFromJSON,
    ExpressionRatingFromJSONTyped,
    ExpressionRatingToJSON,
} from './ExpressionRating';
import {
    TableRating,
    TableRatingFromJSON,
    TableRatingFromJSONTyped,
    TableRatingToJSON,
} from './TableRating';
import {
    TransitionalRating,
    TransitionalRatingFromJSON,
    TransitionalRatingFromJSONTyped,
    TransitionalRatingToJSON,
} from './TransitionalRating';
import {
    UsgsStreamRating,
    UsgsStreamRatingFromJSON,
    UsgsStreamRatingFromJSONTyped,
    UsgsStreamRatingToJSON,
} from './UsgsStreamRating';
import {
    VirtualRating,
    VirtualRatingFromJSON,
    VirtualRatingFromJSONTyped,
    VirtualRatingToJSON,
} from './VirtualRating';

/**
 * @type AbstractRatingMetadata
 * Rating Metadata
 * @export
 */
export type AbstractRatingMetadata = { ratingType: 'expression-rating' } & ExpressionRating | { ratingType: 'table' } & TableRating | { ratingType: 'transitional' } & TransitionalRating | { ratingType: 'usgs' } & UsgsStreamRating | { ratingType: 'virtual' } & VirtualRating;

export function AbstractRatingMetadataFromJSON(json: any): AbstractRatingMetadata {
    return AbstractRatingMetadataFromJSONTyped(json, false);
}

export function AbstractRatingMetadataFromJSONTyped(json: any, ignoreDiscriminator: boolean): AbstractRatingMetadata {
    if ((json === undefined) || (json === null)) {
        return json;
    }
    switch (json['ratingType']) {
        case 'expression-rating':
            return {...ExpressionRatingFromJSONTyped(json, true), ratingType: 'expression-rating'};
        case 'table':
            return {...TableRatingFromJSONTyped(json, true), ratingType: 'table'};
        case 'transitional':
            return {...TransitionalRatingFromJSONTyped(json, true), ratingType: 'transitional'};
        case 'usgs':
            return {...UsgsStreamRatingFromJSONTyped(json, true), ratingType: 'usgs'};
        case 'virtual':
            return {...VirtualRatingFromJSONTyped(json, true), ratingType: 'virtual'};
        default:
            throw new Error(`No variant of AbstractRatingMetadata exists with 'ratingType=${json['ratingType']}'`);
    }
}

export function AbstractRatingMetadataToJSON(value?: AbstractRatingMetadata | null): any {
    if (value === undefined) {
        return undefined;
    }
    if (value === null) {
        return null;
    }
    switch (value['ratingType']) {
        case 'expression-rating':
            return ExpressionRatingToJSON(value);
        case 'table':
            return TableRatingToJSON(value);
        case 'transitional':
            return TransitionalRatingToJSON(value as TransitionalRating);
        case 'usgs':
            return UsgsStreamRatingToJSON(value);
        case 'virtual':
            return VirtualRatingToJSON(value as VirtualRating);
        default:
            throw new Error(`No variant of AbstractRatingMetadata exists with 'ratingType=${value['ratingType']}'`);
    }
}

