<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: apache/rocketmq/v2/definition.proto

namespace Apache\Rocketmq\V2;

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

/**
 * User Agent
 *
 * Generated from protobuf message <code>apache.rocketmq.v2.UA</code>
 */
class UA extends \Google\Protobuf\Internal\Message
{
    /**
     * SDK language
     *
     * Generated from protobuf field <code>.apache.rocketmq.v2.Language language = 1;</code>
     */
    protected $language = 0;
    /**
     * SDK version
     *
     * Generated from protobuf field <code>string version = 2;</code>
     */
    protected $version = '';
    /**
     * Platform details, including OS name, version, arch etc.
     *
     * Generated from protobuf field <code>string platform = 3;</code>
     */
    protected $platform = '';
    /**
     * Hostname of the node
     *
     * Generated from protobuf field <code>string hostname = 4;</code>
     */
    protected $hostname = '';

    /**
     * Constructor.
     *
     * @param array $data {
     *     Optional. Data for populating the Message object.
     *
     *     @type int $language
     *           SDK language
     *     @type string $version
     *           SDK version
     *     @type string $platform
     *           Platform details, including OS name, version, arch etc.
     *     @type string $hostname
     *           Hostname of the node
     * }
     */
    public function __construct($data = NULL) {
        \GPBMetadata\Apache\Rocketmq\V2\Definition::initOnce();
        parent::__construct($data);
    }

    /**
     * SDK language
     *
     * Generated from protobuf field <code>.apache.rocketmq.v2.Language language = 1;</code>
     * @return int
     */
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * SDK language
     *
     * Generated from protobuf field <code>.apache.rocketmq.v2.Language language = 1;</code>
     * @param int $var
     * @return $this
     */
    public function setLanguage($var)
    {
        GPBUtil::checkEnum($var, \Apache\Rocketmq\V2\Language::class);
        $this->language = $var;

        return $this;
    }

    /**
     * SDK version
     *
     * Generated from protobuf field <code>string version = 2;</code>
     * @return string
     */
    public function getVersion()
    {
        return $this->version;
    }

    /**
     * SDK version
     *
     * Generated from protobuf field <code>string version = 2;</code>
     * @param string $var
     * @return $this
     */
    public function setVersion($var)
    {
        GPBUtil::checkString($var, True);
        $this->version = $var;

        return $this;
    }

    /**
     * Platform details, including OS name, version, arch etc.
     *
     * Generated from protobuf field <code>string platform = 3;</code>
     * @return string
     */
    public function getPlatform()
    {
        return $this->platform;
    }

    /**
     * Platform details, including OS name, version, arch etc.
     *
     * Generated from protobuf field <code>string platform = 3;</code>
     * @param string $var
     * @return $this
     */
    public function setPlatform($var)
    {
        GPBUtil::checkString($var, True);
        $this->platform = $var;

        return $this;
    }

    /**
     * Hostname of the node
     *
     * Generated from protobuf field <code>string hostname = 4;</code>
     * @return string
     */
    public function getHostname()
    {
        return $this->hostname;
    }

    /**
     * Hostname of the node
     *
     * Generated from protobuf field <code>string hostname = 4;</code>
     * @param string $var
     * @return $this
     */
    public function setHostname($var)
    {
        GPBUtil::checkString($var, True);
        $this->hostname = $var;

        return $this;
    }

}

