// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/appengine/v1/audit_data.proto

package appengine

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/iam/v1"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// App Engine admin service audit log.
type AuditData struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Detailed information about methods that require it. Does not include
	// simple Get, List or Delete methods because all significant information
	// (resource name, number of returned elements for List operations) is already
	// included in parent audit log message.
	//
	// Types that are assignable to Method:
	//	*AuditData_UpdateService
	//	*AuditData_CreateVersion
	Method isAuditData_Method `protobuf_oneof:"method"`
}

func (x *AuditData) Reset() {
	*x = AuditData{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_appengine_v1_audit_data_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AuditData) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AuditData) ProtoMessage() {}

func (x *AuditData) ProtoReflect() protoreflect.Message {
	mi := &file_google_appengine_v1_audit_data_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AuditData.ProtoReflect.Descriptor instead.
func (*AuditData) Descriptor() ([]byte, []int) {
	return file_google_appengine_v1_audit_data_proto_rawDescGZIP(), []int{0}
}

func (m *AuditData) GetMethod() isAuditData_Method {
	if m != nil {
		return m.Method
	}
	return nil
}

func (x *AuditData) GetUpdateService() *UpdateServiceMethod {
	if x, ok := x.GetMethod().(*AuditData_UpdateService); ok {
		return x.UpdateService
	}
	return nil
}

func (x *AuditData) GetCreateVersion() *CreateVersionMethod {
	if x, ok := x.GetMethod().(*AuditData_CreateVersion); ok {
		return x.CreateVersion
	}
	return nil
}

type isAuditData_Method interface {
	isAuditData_Method()
}

type AuditData_UpdateService struct {
	// Detailed information about UpdateService call.
	UpdateService *UpdateServiceMethod `protobuf:"bytes,1,opt,name=update_service,json=updateService,proto3,oneof"`
}

type AuditData_CreateVersion struct {
	// Detailed information about CreateVersion call.
	CreateVersion *CreateVersionMethod `protobuf:"bytes,2,opt,name=create_version,json=createVersion,proto3,oneof"`
}

func (*AuditData_UpdateService) isAuditData_Method() {}

func (*AuditData_CreateVersion) isAuditData_Method() {}

// Detailed information about UpdateService call.
type UpdateServiceMethod struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Update service request.
	Request *UpdateServiceRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
}

func (x *UpdateServiceMethod) Reset() {
	*x = UpdateServiceMethod{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_appengine_v1_audit_data_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdateServiceMethod) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateServiceMethod) ProtoMessage() {}

func (x *UpdateServiceMethod) ProtoReflect() protoreflect.Message {
	mi := &file_google_appengine_v1_audit_data_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdateServiceMethod.ProtoReflect.Descriptor instead.
func (*UpdateServiceMethod) Descriptor() ([]byte, []int) {
	return file_google_appengine_v1_audit_data_proto_rawDescGZIP(), []int{1}
}

func (x *UpdateServiceMethod) GetRequest() *UpdateServiceRequest {
	if x != nil {
		return x.Request
	}
	return nil
}

// Detailed information about CreateVersion call.
type CreateVersionMethod struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Create version request.
	Request *CreateVersionRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
}

func (x *CreateVersionMethod) Reset() {
	*x = CreateVersionMethod{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_appengine_v1_audit_data_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CreateVersionMethod) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateVersionMethod) ProtoMessage() {}

func (x *CreateVersionMethod) ProtoReflect() protoreflect.Message {
	mi := &file_google_appengine_v1_audit_data_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreateVersionMethod.ProtoReflect.Descriptor instead.
func (*CreateVersionMethod) Descriptor() ([]byte, []int) {
	return file_google_appengine_v1_audit_data_proto_rawDescGZIP(), []int{2}
}

func (x *CreateVersionMethod) GetRequest() *CreateVersionRequest {
	if x != nil {
		return x.Request
	}
	return nil
}

var File_google_appengine_v1_audit_data_proto protoreflect.FileDescriptor

var file_google_appengine_v1_audit_data_proto_rawDesc = []byte{
	0x0a, 0x24, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69,
	0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
	0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x23, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31,
	0x2f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,
	0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x22, 0xbb, 0x01, 0x0a, 0x09, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x51,
	0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,
	0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64,
	0x48, 0x00, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
	0x65, 0x12, 0x51, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e,
	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74,
	0x68, 0x6f, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x5a,
	0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d,
	0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,
	0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5a, 0x0a, 0x13, 0x43, 0x72,
	0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f,
	0x64, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x65,
	0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x69, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76,
	0x31, 0x42, 0x0e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74,
	0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61,
	0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x65, 0x6e,
	0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e,
	0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_appengine_v1_audit_data_proto_rawDescOnce sync.Once
	file_google_appengine_v1_audit_data_proto_rawDescData = file_google_appengine_v1_audit_data_proto_rawDesc
)

func file_google_appengine_v1_audit_data_proto_rawDescGZIP() []byte {
	file_google_appengine_v1_audit_data_proto_rawDescOnce.Do(func() {
		file_google_appengine_v1_audit_data_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_appengine_v1_audit_data_proto_rawDescData)
	})
	return file_google_appengine_v1_audit_data_proto_rawDescData
}

var file_google_appengine_v1_audit_data_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_google_appengine_v1_audit_data_proto_goTypes = []interface{}{
	(*AuditData)(nil),            // 0: google.appengine.v1.AuditData
	(*UpdateServiceMethod)(nil),  // 1: google.appengine.v1.UpdateServiceMethod
	(*CreateVersionMethod)(nil),  // 2: google.appengine.v1.CreateVersionMethod
	(*UpdateServiceRequest)(nil), // 3: google.appengine.v1.UpdateServiceRequest
	(*CreateVersionRequest)(nil), // 4: google.appengine.v1.CreateVersionRequest
}
var file_google_appengine_v1_audit_data_proto_depIdxs = []int32{
	1, // 0: google.appengine.v1.AuditData.update_service:type_name -> google.appengine.v1.UpdateServiceMethod
	2, // 1: google.appengine.v1.AuditData.create_version:type_name -> google.appengine.v1.CreateVersionMethod
	3, // 2: google.appengine.v1.UpdateServiceMethod.request:type_name -> google.appengine.v1.UpdateServiceRequest
	4, // 3: google.appengine.v1.CreateVersionMethod.request:type_name -> google.appengine.v1.CreateVersionRequest
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_google_appengine_v1_audit_data_proto_init() }
func file_google_appengine_v1_audit_data_proto_init() {
	if File_google_appengine_v1_audit_data_proto != nil {
		return
	}
	file_google_appengine_v1_appengine_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_appengine_v1_audit_data_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuditData); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_appengine_v1_audit_data_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateServiceMethod); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_appengine_v1_audit_data_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreateVersionMethod); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_appengine_v1_audit_data_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*AuditData_UpdateService)(nil),
		(*AuditData_CreateVersion)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_appengine_v1_audit_data_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_appengine_v1_audit_data_proto_goTypes,
		DependencyIndexes: file_google_appengine_v1_audit_data_proto_depIdxs,
		MessageInfos:      file_google_appengine_v1_audit_data_proto_msgTypes,
	}.Build()
	File_google_appengine_v1_audit_data_proto = out.File
	file_google_appengine_v1_audit_data_proto_rawDesc = nil
	file_google_appengine_v1_audit_data_proto_goTypes = nil
	file_google_appengine_v1_audit_data_proto_depIdxs = nil
}
