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

namespace Gtfs;

use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;

/**
 * Generated from protobuf message <code>gtfs.Route</code>
 */
class Route extends \Google\Protobuf\Internal\Message
{
    /**
     * The route_id field contains an ID that uniquely identifies a route.
     * The route_id is dataset unique.
     *
     * Generated from protobuf field <code>string route_id = 1;</code>
     */
    protected $route_id = '';
    /**
     * The agency_id field defines an agency for the specified route.
     *
     * Generated from protobuf field <code>string agency_id = 2;</code>
     */
    protected $agency_id = '';
    /**
     * The route_short_name contains the short name of a route.
     *
     * Generated from protobuf field <code>string route_short_name = 3;</code>
     */
    protected $route_short_name = '';
    /**
     * The route_long_name contains the full name of a route.
     *
     * Generated from protobuf field <code>string route_long_name = 4;</code>
     */
    protected $route_long_name = '';
    /**
     * The route_desc field contains a description of a route.
     *
     * Generated from protobuf field <code>string route_desc = 5;</code>
     */
    protected $route_desc = '';
    /**
     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
     */
    protected $route_type = 0;
    /**
     * The route_url field contains the URL of a web page about that particular route.
     *
     * Generated from protobuf field <code>string route_url = 7;</code>
     */
    protected $route_url = '';
    /**
     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
     *
     * Generated from protobuf field <code>string route_color = 8;</code>
     */
    protected $route_color = '';
    /**
     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
     *
     * Generated from protobuf field <code>string route_text_color = 9;</code>
     */
    protected $route_text_color = '';
    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     */
    protected $extension = null;

    /**
     * Constructor.
     *
     * @param array $data {
     *     Optional. Data for populating the Message object.
     *
     *     @type string $route_id
     *           The route_id field contains an ID that uniquely identifies a route.
     *           The route_id is dataset unique.
     *     @type string $agency_id
     *           The agency_id field defines an agency for the specified route.
     *     @type string $route_short_name
     *           The route_short_name contains the short name of a route.
     *     @type string $route_long_name
     *           The route_long_name contains the full name of a route.
     *     @type string $route_desc
     *           The route_desc field contains a description of a route.
     *     @type int $route_type
     *     @type string $route_url
     *           The route_url field contains the URL of a web page about that particular route.
     *     @type string $route_color
     *           In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
     *           The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
     *     @type string $route_text_color
     *           The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
     *     @type \Google\Protobuf\Any $extension
     *           The extensions namespace allows 3rd-party developers to extend the
     *           GTFS specification in order to add and evaluate new features and
     *           modifications to the spec.
     * }
     */
    public function __construct($data = NULL) {
        \GPBMetadata\Proto\Gtfs::initOnce();
        parent::__construct($data);
    }

    /**
     * The route_id field contains an ID that uniquely identifies a route.
     * The route_id is dataset unique.
     *
     * Generated from protobuf field <code>string route_id = 1;</code>
     * @return string
     */
    public function getRouteId()
    {
        return $this->route_id;
    }

    /**
     * The route_id field contains an ID that uniquely identifies a route.
     * The route_id is dataset unique.
     *
     * Generated from protobuf field <code>string route_id = 1;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteId($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_id = $var;

        return $this;
    }

    /**
     * The agency_id field defines an agency for the specified route.
     *
     * Generated from protobuf field <code>string agency_id = 2;</code>
     * @return string
     */
    public function getAgencyId()
    {
        return $this->agency_id;
    }

    /**
     * The agency_id field defines an agency for the specified route.
     *
     * Generated from protobuf field <code>string agency_id = 2;</code>
     * @param string $var
     * @return $this
     */
    public function setAgencyId($var)
    {
        GPBUtil::checkString($var, True);
        $this->agency_id = $var;

        return $this;
    }

    /**
     * The route_short_name contains the short name of a route.
     *
     * Generated from protobuf field <code>string route_short_name = 3;</code>
     * @return string
     */
    public function getRouteShortName()
    {
        return $this->route_short_name;
    }

    /**
     * The route_short_name contains the short name of a route.
     *
     * Generated from protobuf field <code>string route_short_name = 3;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteShortName($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_short_name = $var;

        return $this;
    }

    /**
     * The route_long_name contains the full name of a route.
     *
     * Generated from protobuf field <code>string route_long_name = 4;</code>
     * @return string
     */
    public function getRouteLongName()
    {
        return $this->route_long_name;
    }

    /**
     * The route_long_name contains the full name of a route.
     *
     * Generated from protobuf field <code>string route_long_name = 4;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteLongName($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_long_name = $var;

        return $this;
    }

    /**
     * The route_desc field contains a description of a route.
     *
     * Generated from protobuf field <code>string route_desc = 5;</code>
     * @return string
     */
    public function getRouteDesc()
    {
        return $this->route_desc;
    }

    /**
     * The route_desc field contains a description of a route.
     *
     * Generated from protobuf field <code>string route_desc = 5;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteDesc($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_desc = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
     * @return int
     */
    public function getRouteType()
    {
        return $this->route_type;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Route.RouteType route_type = 6;</code>
     * @param int $var
     * @return $this
     */
    public function setRouteType($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Route_RouteType::class);
        $this->route_type = $var;

        return $this;
    }

    /**
     * The route_url field contains the URL of a web page about that particular route.
     *
     * Generated from protobuf field <code>string route_url = 7;</code>
     * @return string
     */
    public function getRouteUrl()
    {
        return $this->route_url;
    }

    /**
     * The route_url field contains the URL of a web page about that particular route.
     *
     * Generated from protobuf field <code>string route_url = 7;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteUrl($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_url = $var;

        return $this;
    }

    /**
     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
     *
     * Generated from protobuf field <code>string route_color = 8;</code>
     * @return string
     */
    public function getRouteColor()
    {
        return $this->route_color;
    }

    /**
     * In systems that have colors assigned to routes, the route_color field defines a color that corresponds to a route.
     * The color must be provided as a six-character hexadecimal number, for example, 00FFFF.
     *
     * Generated from protobuf field <code>string route_color = 8;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteColor($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_color = $var;

        return $this;
    }

    /**
     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
     *
     * Generated from protobuf field <code>string route_text_color = 9;</code>
     * @return string
     */
    public function getRouteTextColor()
    {
        return $this->route_text_color;
    }

    /**
     * The route_text_color field can be used to specify a legible color to use for text drawn against a background of route_color.
     *
     * Generated from protobuf field <code>string route_text_color = 9;</code>
     * @param string $var
     * @return $this
     */
    public function setRouteTextColor($var)
    {
        GPBUtil::checkString($var, True);
        $this->route_text_color = $var;

        return $this;
    }

    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     * @return \Google\Protobuf\Any
     */
    public function getExtension()
    {
        return $this->extension;
    }

    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     * @param \Google\Protobuf\Any $var
     * @return $this
     */
    public function setExtension($var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Any::class);
        $this->extension = $var;

        return $this;
    }

}

