<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: google/protobuf/any.proto

namespace Google\Protobuf;

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

/**
 * `Any` contains an arbitrary serialized protocol buffer message along with a
 * URL that describes the type of the serialized message.
 * In its binary encoding, an `Any` is an ordinary message; but in other wire
 * forms like JSON, it has a special encoding. The format of the type URL is
 * described on the `type_url` field.
 * Protobuf APIs provide utilities to interact with `Any` values:
 * - A 'pack' operation accepts a message and constructs a generic `Any` wrapper
 *   around it.
 * - An 'unpack' operation reads the content of an `Any` message, either into an
 *   existing message or a new one. Unpack operations must check the type of the
 *   value they unpack against the declared `type_url`.
 * - An 'is' operation decides whether an `Any` contains a message of the given
 *   type, i.e. whether it can 'unpack' that type.
 * The JSON format representation of an `Any` follows one of these cases:
 * - For types without special-cased JSON encodings, the JSON format
 *   representation of the `Any` is the same as that of the message, with an
 *   additional `\@type` field which contains the type URL.
 * - For types with special-cased JSON encodings (typically called 'well-known'
 *   types, listed in https://protobuf.dev/programming-guides/json/#any), the
 *   JSON format representation has a key `\@type` which contains the type URL
 *   and a key `value` which contains the JSON-serialized value.
 * The text format representation of an `Any` is like a message with one field
 * whose name is the type URL in brackets. For example, an `Any` containing a
 * `foo.Bar` message may be written `[type.googleapis.com/foo.Bar] { a: 2 }`.
 *
 * Generated from protobuf message <code>google.protobuf.Any</code>
 */
class Any extends \Google\Protobuf\Internal\AnyBase
{
    /**
     * Identifies the type of the serialized Protobuf message with a URI reference
     * consisting of a prefix ending in a slash and the fully-qualified type name.
     * Example: type.googleapis.com/google.protobuf.StringValue
     * This string must contain at least one `/` character, and the content after
     * the last `/` must be the fully-qualified name of the type in canonical
     * form, without a leading dot. Do not write a scheme on these URI references
     * so that clients do not attempt to contact them.
     * The prefix is arbitrary and Protobuf implementations are expected to
     * simply strip off everything up to and including the last `/` to identify
     * the type. `type.googleapis.com/` is a common default prefix that some
     * legacy implementations require. This prefix does not indicate the origin of
     * the type, and URIs containing it are not expected to respond to any
     * requests.
     * All type URL strings must be legal URI references with the additional
     * restriction (for the text format) that the content of the reference
     * must consist only of alphanumeric characters, percent-encoded escapes, and
     * characters in the following set (not including the outer backticks):
     * `/-.~_!$&()*+,;=`. Despite our allowing percent encodings, implementations
     * should not unescape them to prevent confusion with existing parsers. For
     * example, `type.googleapis.com%2FFoo` should be rejected.
     * In the original design of `Any`, the possibility of launching a type
     * resolution service at these type URLs was considered but Protobuf never
     * implemented one and considers contacting these URLs to be problematic and
     * a potential security issue. Do not attempt to contact type URLs.
     *
     * Generated from protobuf field <code>string type_url = 1;</code>
     */
    protected $type_url = '';
    /**
     * Holds a Protobuf serialization of the type described by type_url.
     *
     * Generated from protobuf field <code>bytes value = 2;</code>
     */
    protected $value = '';

    /**
     * Constructor.
     *
     * @param array $data {
     *     Optional. Data for populating the Message object.
     *
     *     @type string $type_url
     *           Identifies the type of the serialized Protobuf message with a URI reference
     *           consisting of a prefix ending in a slash and the fully-qualified type name.
     *           Example: type.googleapis.com/google.protobuf.StringValue
     *           This string must contain at least one `/` character, and the content after
     *           the last `/` must be the fully-qualified name of the type in canonical
     *           form, without a leading dot. Do not write a scheme on these URI references
     *           so that clients do not attempt to contact them.
     *           The prefix is arbitrary and Protobuf implementations are expected to
     *           simply strip off everything up to and including the last `/` to identify
     *           the type. `type.googleapis.com/` is a common default prefix that some
     *           legacy implementations require. This prefix does not indicate the origin of
     *           the type, and URIs containing it are not expected to respond to any
     *           requests.
     *           All type URL strings must be legal URI references with the additional
     *           restriction (for the text format) that the content of the reference
     *           must consist only of alphanumeric characters, percent-encoded escapes, and
     *           characters in the following set (not including the outer backticks):
     *           `/-.~_!$&()*+,;=`. Despite our allowing percent encodings, implementations
     *           should not unescape them to prevent confusion with existing parsers. For
     *           example, `type.googleapis.com%2FFoo` should be rejected.
     *           In the original design of `Any`, the possibility of launching a type
     *           resolution service at these type URLs was considered but Protobuf never
     *           implemented one and considers contacting these URLs to be problematic and
     *           a potential security issue. Do not attempt to contact type URLs.
     *     @type string $value
     *           Holds a Protobuf serialization of the type described by type_url.
     * }
     */
    public function __construct($data = NULL) {
        \GPBMetadata\Google\Protobuf\Any::initOnce();
        parent::__construct($data);
    }

    /**
     * Identifies the type of the serialized Protobuf message with a URI reference
     * consisting of a prefix ending in a slash and the fully-qualified type name.
     * Example: type.googleapis.com/google.protobuf.StringValue
     * This string must contain at least one `/` character, and the content after
     * the last `/` must be the fully-qualified name of the type in canonical
     * form, without a leading dot. Do not write a scheme on these URI references
     * so that clients do not attempt to contact them.
     * The prefix is arbitrary and Protobuf implementations are expected to
     * simply strip off everything up to and including the last `/` to identify
     * the type. `type.googleapis.com/` is a common default prefix that some
     * legacy implementations require. This prefix does not indicate the origin of
     * the type, and URIs containing it are not expected to respond to any
     * requests.
     * All type URL strings must be legal URI references with the additional
     * restriction (for the text format) that the content of the reference
     * must consist only of alphanumeric characters, percent-encoded escapes, and
     * characters in the following set (not including the outer backticks):
     * `/-.~_!$&()*+,;=`. Despite our allowing percent encodings, implementations
     * should not unescape them to prevent confusion with existing parsers. For
     * example, `type.googleapis.com%2FFoo` should be rejected.
     * In the original design of `Any`, the possibility of launching a type
     * resolution service at these type URLs was considered but Protobuf never
     * implemented one and considers contacting these URLs to be problematic and
     * a potential security issue. Do not attempt to contact type URLs.
     *
     * Generated from protobuf field <code>string type_url = 1;</code>
     * @return string
     */
    public function getTypeUrl()
    {
        return $this->type_url;
    }

    /**
     * Identifies the type of the serialized Protobuf message with a URI reference
     * consisting of a prefix ending in a slash and the fully-qualified type name.
     * Example: type.googleapis.com/google.protobuf.StringValue
     * This string must contain at least one `/` character, and the content after
     * the last `/` must be the fully-qualified name of the type in canonical
     * form, without a leading dot. Do not write a scheme on these URI references
     * so that clients do not attempt to contact them.
     * The prefix is arbitrary and Protobuf implementations are expected to
     * simply strip off everything up to and including the last `/` to identify
     * the type. `type.googleapis.com/` is a common default prefix that some
     * legacy implementations require. This prefix does not indicate the origin of
     * the type, and URIs containing it are not expected to respond to any
     * requests.
     * All type URL strings must be legal URI references with the additional
     * restriction (for the text format) that the content of the reference
     * must consist only of alphanumeric characters, percent-encoded escapes, and
     * characters in the following set (not including the outer backticks):
     * `/-.~_!$&()*+,;=`. Despite our allowing percent encodings, implementations
     * should not unescape them to prevent confusion with existing parsers. For
     * example, `type.googleapis.com%2FFoo` should be rejected.
     * In the original design of `Any`, the possibility of launching a type
     * resolution service at these type URLs was considered but Protobuf never
     * implemented one and considers contacting these URLs to be problematic and
     * a potential security issue. Do not attempt to contact type URLs.
     *
     * Generated from protobuf field <code>string type_url = 1;</code>
     * @param string $var
     * @return $this
     */
    public function setTypeUrl(string $var)
    {
        GPBUtil::checkString($var, true);
        $this->type_url = $var;

        return $this;
    }

    /**
     * Holds a Protobuf serialization of the type described by type_url.
     *
     * Generated from protobuf field <code>bytes value = 2;</code>
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Holds a Protobuf serialization of the type described by type_url.
     *
     * Generated from protobuf field <code>bytes value = 2;</code>
     * @param string $var
     * @return $this
     */
    public function setValue(string $var)
    {
        GPBUtil::checkString($var, false);
        $this->value = $var;

        return $this;
    }

}

