//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.25.0
// 	protoc        v3.17.3
// source: Request.proto

package api

import (
	proto "github.com/golang/protobuf/proto"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

type ServiceRequest_ServiceRequestType int32

const (
	ServiceRequest_UPDATE     ServiceRequest_ServiceRequestType = 0
	ServiceRequest_DELETE     ServiceRequest_ServiceRequestType = 1
	ServiceRequest_INITIALIZE ServiceRequest_ServiceRequestType = 2
)

// Enum value maps for ServiceRequest_ServiceRequestType.
var (
	ServiceRequest_ServiceRequestType_name = map[int32]string{
		0: "UPDATE",
		1: "DELETE",
		2: "INITIALIZE",
	}
	ServiceRequest_ServiceRequestType_value = map[string]int32{
		"UPDATE":     0,
		"DELETE":     1,
		"INITIALIZE": 2,
	}
)

func (x ServiceRequest_ServiceRequestType) Enum() *ServiceRequest_ServiceRequestType {
	p := new(ServiceRequest_ServiceRequestType)
	*p = x
	return p
}

func (x ServiceRequest_ServiceRequestType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ServiceRequest_ServiceRequestType) Descriptor() protoreflect.EnumDescriptor {
	return file_Request_proto_enumTypes[0].Descriptor()
}

func (ServiceRequest_ServiceRequestType) Type() protoreflect.EnumType {
	return &file_Request_proto_enumTypes[0]
}

func (x ServiceRequest_ServiceRequestType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ServiceRequest_ServiceRequestType.Descriptor instead.
func (ServiceRequest_ServiceRequestType) EnumDescriptor() ([]byte, []int) {
	return file_Request_proto_rawDescGZIP(), []int{0, 0}
}

type ServiceRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ServiceRequestType ServiceRequest_ServiceRequestType `protobuf:"varint,1,opt,name=serviceRequestType,proto3,enum=proto.ServiceRequest_ServiceRequestType" json:"serviceRequestType,omitempty"`
	RequestId          string                            `protobuf:"bytes,2,opt,name=requestId,proto3" json:"requestId,omitempty"`
	FunctionMetaData   *FunctionMetaData                 `protobuf:"bytes,3,opt,name=functionMetaData,proto3" json:"functionMetaData,omitempty"`
	WorkerId           string                            `protobuf:"bytes,4,opt,name=workerId,proto3" json:"workerId,omitempty"`
}

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

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

func (*ServiceRequest) ProtoMessage() {}

func (x *ServiceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_Request_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 ServiceRequest.ProtoReflect.Descriptor instead.
func (*ServiceRequest) Descriptor() ([]byte, []int) {
	return file_Request_proto_rawDescGZIP(), []int{0}
}

func (x *ServiceRequest) GetServiceRequestType() ServiceRequest_ServiceRequestType {
	if x != nil {
		return x.ServiceRequestType
	}
	return ServiceRequest_UPDATE
}

func (x *ServiceRequest) GetRequestId() string {
	if x != nil {
		return x.RequestId
	}
	return ""
}

func (x *ServiceRequest) GetFunctionMetaData() *FunctionMetaData {
	if x != nil {
		return x.FunctionMetaData
	}
	return nil
}

func (x *ServiceRequest) GetWorkerId() string {
	if x != nil {
		return x.WorkerId
	}
	return ""
}

var File_Request_proto protoreflect.FileDescriptor

var file_Request_proto_rawDesc = []byte{
	0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
	0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69,
	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x12, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65,
	0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,
	0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,
	0x64, 0x12, 0x43, 0x0a, 0x10, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74,
	0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61,
	0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65,
	0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72,
	0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72,
	0x49, 0x64, 0x22, 0x3c, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41,
	0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01,
	0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x10, 0x02,
	0x42, 0x2c, 0x0a, 0x21, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x70,
	0x75, 0x6c, 0x73, 0x61, 0x72, 0x2e, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_Request_proto_rawDescOnce sync.Once
	file_Request_proto_rawDescData = file_Request_proto_rawDesc
)

func file_Request_proto_rawDescGZIP() []byte {
	file_Request_proto_rawDescOnce.Do(func() {
		file_Request_proto_rawDescData = protoimpl.X.CompressGZIP(file_Request_proto_rawDescData)
	})
	return file_Request_proto_rawDescData
}

var file_Request_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_Request_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_Request_proto_goTypes = []interface{}{
	(ServiceRequest_ServiceRequestType)(0), // 0: proto.ServiceRequest.ServiceRequestType
	(*ServiceRequest)(nil),                 // 1: proto.ServiceRequest
	(*FunctionMetaData)(nil),               // 2: proto.FunctionMetaData
}
var file_Request_proto_depIdxs = []int32{
	0, // 0: proto.ServiceRequest.serviceRequestType:type_name -> proto.ServiceRequest.ServiceRequestType
	2, // 1: proto.ServiceRequest.functionMetaData:type_name -> proto.FunctionMetaData
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_Request_proto_init() }
func file_Request_proto_init() {
	if File_Request_proto != nil {
		return
	}
	file_Function_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_Request_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServiceRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_Request_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_Request_proto_goTypes,
		DependencyIndexes: file_Request_proto_depIdxs,
		EnumInfos:         file_Request_proto_enumTypes,
		MessageInfos:      file_Request_proto_msgTypes,
	}.Build()
	File_Request_proto = out.File
	file_Request_proto_rawDesc = nil
	file_Request_proto_goTypes = nil
	file_Request_proto_depIdxs = nil
}
