// Generated by the protocol buffer compiler.  DO NOT EDIT!
// NO CHECKED-IN PROTOBUF GENCODE
// clang-format off
// source: google/protobuf/any.proto

#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"

#if GOOGLE_PROTOBUF_OBJC_VERSION < 40311
#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
#endif
#if 40311 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
#endif

// @@protoc_insertion_point(imports)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

CF_EXTERN_C_BEGIN

NS_ASSUME_NONNULL_BEGIN

#pragma mark - GPBAnyRoot

/**
 * Exposes the extension registry for this file.
 *
 * The base class provides:
 * @code
 *   + (GPBExtensionRegistry *)extensionRegistry;
 * @endcode
 * which is a @c GPBExtensionRegistry that includes all the extensions defined by
 * this file and all files that it depends on.
 **/
GPB_FINAL @interface GPBAnyRoot : GPBRootObject
@end

#pragma mark - GPBAny

typedef GPB_ENUM(GPBAny_FieldNumber) {
  GPBAny_FieldNumber_TypeURL = 1,
  GPBAny_FieldNumber_Value = 2,
};

/**
 * `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 }`.
 **/
GPB_FINAL @interface GPBAny : GPBMessage

/**
 * 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.
 **/
@property(nonatomic, readwrite, copy, null_resettable) NSString *typeURL;

/** Holds a Protobuf serialization of the type described by type_url. */
@property(nonatomic, readwrite, copy, null_resettable) NSData *value;

// NOTE: There are some Objective-C specific methods/properties in
// GPBWellKnownTypes.h that will likely be useful.

@end

NS_ASSUME_NONNULL_END

CF_EXTERN_C_END

#pragma clang diagnostic pop

// @@protoc_insertion_point(global_scope)

// clang-format on
