<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: proto/gtfs.proto

namespace Gtfs\Route;

use UnexpectedValueException;

/**
 * The route_type field describes the type of transportation used on a route.
 *
 * Protobuf type <code>gtfs.Route.RouteType</code>
 */
class RouteType
{
    /**
     * Tram, Streetcar, Light rail. Any light rail or street level system within a metropolitan area.
     *
     * Generated from protobuf enum <code>TRAM = 0;</code>
     */
    const TRAM = 0;
    /**
     * Subway, Metro. Any underground rail system within a metropolitan area.
     *
     * Generated from protobuf enum <code>SUBWAY = 1;</code>
     */
    const SUBWAY = 1;
    /**
     * Rail. Used for intercity or long-distance travel.
     *
     * Generated from protobuf enum <code>RAIL = 2;</code>
     */
    const RAIL = 2;
    /**
     * Bus. Used for short- and long-distance bus routes.
     *
     * Generated from protobuf enum <code>BUS = 3;</code>
     */
    const BUS = 3;
    /**
     * Ferry. Used for short- and long-distance boat service.
     *
     * Generated from protobuf enum <code>FERRY = 4;</code>
     */
    const FERRY = 4;
    /**
     * Cable car. Used for street-level cable cars where the cable runs beneath the car.
     *
     * Generated from protobuf enum <code>CABLECAR = 5;</code>
     */
    const CABLECAR = 5;
    /**
     * Gondola, Suspended cable car. Typically used for aerial cable cars where the car is suspended from the cable.
     *
     * Generated from protobuf enum <code>GONDOLA = 6;</code>
     */
    const GONDOLA = 6;
    /**
     * Funicular. Any rail system designed for steep inclines.
     *
     * Generated from protobuf enum <code>FUNICULAR = 7;</code>
     */
    const FUNICULAR = 7;

    private static $valueToName = [
        self::TRAM => 'TRAM',
        self::SUBWAY => 'SUBWAY',
        self::RAIL => 'RAIL',
        self::BUS => 'BUS',
        self::FERRY => 'FERRY',
        self::CABLECAR => 'CABLECAR',
        self::GONDOLA => 'GONDOLA',
        self::FUNICULAR => 'FUNICULAR',
    ];

    public static function name($value)
    {
        if (!isset(self::$valueToName[$value])) {
            throw new UnexpectedValueException(sprintf(
                    'Enum %s has no name defined for value %s', __CLASS__, $value));
        }
        return self::$valueToName[$value];
    }


    public static function value($name)
    {
        $const = __CLASS__ . '::' . strtoupper($name);
        if (!defined($const)) {
            throw new UnexpectedValueException(sprintf(
                    'Enum %s has no value defined for name %s', __CLASS__, $name));
        }
        return constant($const);
    }
}

// Adding a class alias for backwards compatibility with the previous class name.
class_alias(RouteType::class, \Gtfs\Route_RouteType::class);

