// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "ProtocolBuffers.h"

#import "Pair.pb.h"
#import "Weave_operation.pb.h"
// @@protoc_insertion_point(imports)

@class Event;
@class EventBuilder;
@class Pair;
@class PairBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif


@interface EventRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface Event : PBGeneratedMessage {
@private
  BOOL hasLogMessage_:1;
  BOOL hasTimestampIso8601_:1;
  BOOL hasOperation_:1;
  BOOL hasTimestampMillis_:1;
  NSString* logMessage;
  NSString* timestampIso8601;
  WeaveOperation operation;
  SInt64 timestampMillis;
  NSMutableArray * additionalDataArray;
}
- (BOOL) hasTimestampMillis;
- (BOOL) hasLogMessage;
- (BOOL) hasOperation;
- (BOOL) hasTimestampIso8601;
@property (readonly) SInt64 timestampMillis;
@property (readonly, strong) NSString* logMessage;
@property (readonly, strong) NSArray * additionalData;
@property (readonly) WeaveOperation operation;
@property (readonly, strong) NSString* timestampIso8601;
- (Pair*)additionalDataAtIndex:(NSUInteger)index;

+ (Event*) defaultInstance;
- (Event*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (EventBuilder*) builder;
+ (EventBuilder*) builder;
+ (EventBuilder*) builderWithPrototype:(Event*) prototype;
- (EventBuilder*) toBuilder;

+ (Event*) parseFromData:(NSData*) data;
+ (Event*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Event*) parseFromInputStream:(NSInputStream*) input;
+ (Event*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Event*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Event*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface EventBuilder : PBGeneratedMessageBuilder {
@private
  Event* result;
}

- (Event*) defaultInstance;

- (EventBuilder*) clear;
- (EventBuilder*) clone;

- (Event*) build;
- (Event*) buildPartial;

- (EventBuilder*) mergeFrom:(Event*) other;
- (EventBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (EventBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasTimestampMillis;
- (SInt64) timestampMillis;
- (EventBuilder*) setTimestampMillis:(SInt64) value;
- (EventBuilder*) clearTimestampMillis;

- (BOOL) hasLogMessage;
- (NSString*) logMessage;
- (EventBuilder*) setLogMessage:(NSString*) value;
- (EventBuilder*) clearLogMessage;

- (NSMutableArray *)additionalData;
- (Pair*)additionalDataAtIndex:(NSUInteger)index;
- (EventBuilder *)addAdditionalData:(Pair*)value;
- (EventBuilder *)setAdditionalDataArray:(NSArray *)array;
- (EventBuilder *)clearAdditionalData;

- (BOOL) hasOperation;
- (WeaveOperation) operation;
- (EventBuilder*) setOperation:(WeaveOperation) value;
- (EventBuilder*) clearOperation;

- (BOOL) hasTimestampIso8601;
- (NSString*) timestampIso8601;
- (EventBuilder*) setTimestampIso8601:(NSString*) value;
- (EventBuilder*) clearTimestampIso8601;
@end


// @@protoc_insertion_point(global_scope)
