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

namespace Gtfs\Stop;

use UnexpectedValueException;

/**
 * Protobuf type <code>gtfs.Stop.WheelchairBoarding</code>
 */
class WheelchairBoarding
{
    /**
     * no accessibility information for the stop
     *
     * Generated from protobuf enum <code>UNKNOWN = 0;</code>
     */
    const UNKNOWN = 0;
    /**
     * some vehicles at this stop can be boarded by a rider in a wheelchair
     *
     * Generated from protobuf enum <code>ACCESSIBLE = 1;</code>
     */
    const ACCESSIBLE = 1;
    /**
     * wheelchair boarding is not possible at this stop
     *
     * Generated from protobuf enum <code>NOT_ACCESSIBLE = 2;</code>
     */
    const NOT_ACCESSIBLE = 2;

    private static $valueToName = [
        self::UNKNOWN => 'UNKNOWN',
        self::ACCESSIBLE => 'ACCESSIBLE',
        self::NOT_ACCESSIBLE => 'NOT_ACCESSIBLE',
    ];

    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(WheelchairBoarding::class, \Gtfs\Stop_WheelchairBoarding::class);

