// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

#import <Foundation/Foundation.h>

@class GPBCodedOutputStream;
@class GPBUInt32Array;
@class GPBUInt64Array;
@class GPBUnknownFieldSet;
@class GPBUnknownFields;

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(uint8_t, GPBUnknownFieldType) {
  GPBUnknownFieldTypeVarint,
  GPBUnknownFieldTypeFixed32,
  GPBUnknownFieldTypeFixed64,
  GPBUnknownFieldTypeLengthDelimited,  // Length prefixed
  GPBUnknownFieldTypeGroup,            // Tag delimited

  /**
   * This type is only used with fields from `GPBUnknownFieldsSet`. Some methods
   * only work with instances with this type and other apis require the other
   * type(s). It is a programming error to use the wrong methods.
   **/
  GPBUnknownFieldTypeLegacy,
};

/**
 * Store an unknown field. These are used in conjunction with GPBUnknownFields.
 **/
__attribute__((objc_subclassing_restricted))
@interface GPBUnknownField : NSObject<NSCopying>

/** Initialize a field with the given number. */
- (instancetype)initWithNumber:(int32_t)number
    __attribute__((deprecated(
        "Use the apis on GPBUnknownFields to add new fields instead of making them directly.")));

/** The field number the data is stored under. */
@property(nonatomic, readonly, assign) int32_t number;

/** The type of the field. */
@property(nonatomic, readonly, assign) GPBUnknownFieldType type;

/**
 * Fetch the varint value.
 *
 * It is a programming error to call this when the `type` is not a varint.
 */
@property(nonatomic, readonly, assign) uint64_t varint;

/**
 * Fetch the fixed32 value.
 *
 * It is a programming error to call this when the `type` is not a fixed32.
 */
@property(nonatomic, readonly, assign) uint32_t fixed32;

/**
 * Fetch the fixed64 value.
 *
 * It is a programming error to call this when the `type` is not a fixed64.
 */
@property(nonatomic, readonly, assign) uint64_t fixed64;

/**
 * Fetch the length delimited (length prefixed) value.
 *
 * It is a programming error to call this when the `type` is not a length
 * delimited.
 */
@property(nonatomic, readonly, strong, nonnull) NSData *lengthDelimited;

/**
 * Fetch the group (tag delimited) value.
 *
 * It is a programming error to call this when the `type` is not a group.
 */
@property(nonatomic, readonly, strong, nonnull) GPBUnknownFields *group;

/**
 * An array of varint values for this field.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 */
@property(nonatomic, readonly, strong) GPBUInt64Array *varintList
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * An array of fixed32 values for this field.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 */
@property(nonatomic, readonly, strong) GPBUInt32Array *fixed32List
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * An array of fixed64 values for this field.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 */
@property(nonatomic, readonly, strong) GPBUInt64Array *fixed64List
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * An array of data values for this field.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 */
@property(nonatomic, readonly, strong) NSArray<NSData *> *lengthDelimitedList
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * An array of groups of values for this field.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 */
@property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet *> *groupList
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * Add a value to the varintList.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 *
 * @param value The value to add.
 **/
- (void)addVarint:(uint64_t)value
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * Add a value to the fixed32List.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 *
 * @param value The value to add.
 **/
- (void)addFixed32:(uint32_t)value
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * Add a value to the fixed64List.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 *
 * @param value The value to add.
 **/
- (void)addFixed64:(uint64_t)value
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * Add a value to the lengthDelimitedList.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 *
 * @param value The value to add.
 **/
- (void)addLengthDelimited:(NSData *)value
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

/**
 * Add a value to the groupList.
 *
 * Only valid for type == GPBUnknownFieldTypeLegacy, it is a programming error
 * to use with any other type.
 *
 * @param value The value to add.
 **/
- (void)addGroup:(GPBUnknownFieldSet *)value
    __attribute__((deprecated("See the new apis on GPBUnknownFields and thus reduced api here.")));

@end

NS_ASSUME_NONNULL_END
