// Copyright 2016 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.12.1
// source: go.chromium.org/luci/logdog/api/endpoints/coordinator/logs/v1/logs.proto

package logdog

import prpc "go.chromium.org/luci/grpc/prpc"

import (
	context "context"
	logpb "go.chromium.org/luci/logdog/api/logpb"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	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)
)

// Trinary represents a trinary value.
type QueryRequest_Trinary int32

const (
	// Both positive and negative results will be returned.
	QueryRequest_BOTH QueryRequest_Trinary = 0
	// Only positive results will be returned.
	QueryRequest_YES QueryRequest_Trinary = 1
	// Only negative results will be returned.
	QueryRequest_NO QueryRequest_Trinary = 2
)

// Enum value maps for QueryRequest_Trinary.
var (
	QueryRequest_Trinary_name = map[int32]string{
		0: "BOTH",
		1: "YES",
		2: "NO",
	}
	QueryRequest_Trinary_value = map[string]int32{
		"BOTH": 0,
		"YES":  1,
		"NO":   2,
	}
)

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

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

func (QueryRequest_Trinary) Descriptor() protoreflect.EnumDescriptor {
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_enumTypes[0].Descriptor()
}

func (QueryRequest_Trinary) Type() protoreflect.EnumType {
	return &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_enumTypes[0]
}

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

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

// GetRequest is the request structure for the user Get endpoint.
//
// If the requested log stream exists, a valid GetRequest will succeed
// regardless of whether the requested log range was available.
//
// Note that this endpoint may return fewer logs than requested due to either
// availability or internal constraints.
type GetRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The request project to request.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The path of the log stream to get.
	//
	// This can either be a LogDog stream path or the SHA256 hash of a LogDog
	// stream path.
	//
	// Some utilities may find passing around a full LogDog path to be cumbersome
	// due to its length. They can opt to pass around the hash instead and
	// retrieve logs using it.
	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
	// If true, requests that the log stream's state is returned.
	State bool `protobuf:"varint,3,opt,name=state,proto3" json:"state,omitempty"`
	// The initial log stream index to retrieve.
	Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
	// The maximum number of bytes to return. If non-zero, it is applied as a
	// constraint to limit the number of logs that are returned.
	//
	// This only returns complete logs. Assuming logs are available, it will
	// return at least one log (even if it violates the size constraint) and as
	// many additional logs as it can without exceeding this constraint.
	ByteCount int32 `protobuf:"varint,5,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	// The maximum number of log records to request.
	//
	// If this value is zero, no count constraint will be applied. If this value
	// is less than zero, no log entries will be returned. This can be used to
	// fetch log stream descriptors without fetching any log records.
	LogCount int32 `protobuf:"varint,6,opt,name=log_count,json=logCount,proto3" json:"log_count,omitempty"`
	// If true, allows the range request to return non-contiguous records.
	//
	// A contiguous request (default) will iterate forwards from the supplied
	// Index and stop if either the end of stream is encountered or there is a
	// missing stream index. A NonContiguous request will remove the latter
	// condition.
	//
	// For example, say the log stream consists of:
	// [3, 4, 6, 7]
	//
	// A contiguous request with Index 3 will return: [3, 4], stopping because
	// 5 is missing. A non-contiguous request will return [3, 4, 6, 7].
	NonContiguous bool                       `protobuf:"varint,7,opt,name=non_contiguous,json=nonContiguous,proto3" json:"non_contiguous,omitempty"`
	GetSignedUrls *GetRequest_SignURLRequest `protobuf:"bytes,8,opt,name=get_signed_urls,json=getSignedUrls,proto3" json:"get_signed_urls,omitempty"`
}

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

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

func (*GetRequest) ProtoMessage() {}

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

func (x *GetRequest) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *GetRequest) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

func (x *GetRequest) GetState() bool {
	if x != nil {
		return x.State
	}
	return false
}

func (x *GetRequest) GetIndex() int64 {
	if x != nil {
		return x.Index
	}
	return 0
}

func (x *GetRequest) GetByteCount() int32 {
	if x != nil {
		return x.ByteCount
	}
	return 0
}

func (x *GetRequest) GetLogCount() int32 {
	if x != nil {
		return x.LogCount
	}
	return 0
}

func (x *GetRequest) GetNonContiguous() bool {
	if x != nil {
		return x.NonContiguous
	}
	return false
}

func (x *GetRequest) GetGetSignedUrls() *GetRequest_SignURLRequest {
	if x != nil {
		return x.GetSignedUrls
	}
	return nil
}

// TailRequest is the request structure for the user Tail endpoint. It returns
// the last log in a given log stream at the time of the request.
type TailRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The request project to request.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The path of the log stream to get.
	//
	// This can either be a LogDog stream path or the SHA256 hash of a LogDog
	// stream path.
	//
	// Some utilities may find passing around a full LogDog path to be cumbersome
	// due to its length. They can opt to pass around the hash instead and
	// retrieve logs using it.
	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
	// If true, requests that the log stream's state is returned.
	State bool `protobuf:"varint,3,opt,name=state,proto3" json:"state,omitempty"`
}

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

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

func (*TailRequest) ProtoMessage() {}

func (x *TailRequest) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_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 TailRequest.ProtoReflect.Descriptor instead.
func (*TailRequest) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescGZIP(), []int{1}
}

func (x *TailRequest) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *TailRequest) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

func (x *TailRequest) GetState() bool {
	if x != nil {
		return x.State
	}
	return false
}

// GetResponse is the response structure for the user Get endpoint.
type GetResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Project is the project name that these logs belong to.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// Realm is the realm (within the project) the stream is associated with.
	Realm string `protobuf:"bytes,6,opt,name=realm,proto3" json:"realm,omitempty"`
	// The log stream descriptor and state for this stream.
	//
	// It can be requested by setting the request's State field to true. If the
	// Proto field is true, the State's Descriptor field will not be included.
	State *LogStreamState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	// The expanded LogStreamDescriptor protobuf. It is intended for JSON
	// consumption.
	//
	// If the GetRequest's Proto field is false, this will be populated;
	// otherwise, the serialized protobuf will be written to the DescriptorProto
	// field.
	Desc *logpb.LogStreamDescriptor `protobuf:"bytes,3,opt,name=desc,proto3" json:"desc,omitempty"`
	// Log represents the set of retrieved log records.
	Logs []*logpb.LogEntry `protobuf:"bytes,4,rep,name=logs,proto3" json:"logs,omitempty"`
	// An optional signed log entry RecordIO protobuf URL, if requested via
	// "sign_entry_url_lifetime".
	SignedUrls *GetResponse_SignedUrls `protobuf:"bytes,5,opt,name=signed_urls,json=signedUrls,proto3" json:"signed_urls,omitempty"`
}

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

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

func (*GetResponse) ProtoMessage() {}

func (x *GetResponse) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_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 GetResponse.ProtoReflect.Descriptor instead.
func (*GetResponse) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescGZIP(), []int{2}
}

func (x *GetResponse) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *GetResponse) GetRealm() string {
	if x != nil {
		return x.Realm
	}
	return ""
}

func (x *GetResponse) GetState() *LogStreamState {
	if x != nil {
		return x.State
	}
	return nil
}

func (x *GetResponse) GetDesc() *logpb.LogStreamDescriptor {
	if x != nil {
		return x.Desc
	}
	return nil
}

func (x *GetResponse) GetLogs() []*logpb.LogEntry {
	if x != nil {
		return x.Logs
	}
	return nil
}

func (x *GetResponse) GetSignedUrls() *GetResponse_SignedUrls {
	if x != nil {
		return x.SignedUrls
	}
	return nil
}

// QueryRequest is the request structure for the user Query endpoint.
type QueryRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// (required) The project to query from.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// (required) The stream query parameter.
	//
	// Paths are of the form "full/path/prefix/+/stream/name", where the
	// "stream/name" portion can contain glob-style "*" and "**" operators.
	//
	// If this is just "full/path/prefix", then the stream/name is assumed to be
	// "**" (meaning all streams).
	//
	// Omitting the full path prefix is an error (no wildcards are permitted).
	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
	// If true, returns that the streams' full state is returned instead of just
	// its Path.
	State bool `protobuf:"varint,3,opt,name=state,proto3" json:"state,omitempty"`
	// If true, causes the requested state to be returned as serialized protobuf
	// data instead of deserialized JSON structures.
	Proto bool `protobuf:"varint,4,opt,name=proto,proto3" json:"proto,omitempty"`
	// Next, if not empty, indicates that this query should continue at the point
	// where the previous query left off.
	Next string `protobuf:"bytes,5,opt,name=next,proto3" json:"next,omitempty"`
	// MaxResults is the maximum number of query results to return.
	//
	// If MaxResults is zero, no upper bound will be indicated. However, the
	// returned result count is still be subject to internal constraints.
	MaxResults int32 `protobuf:"varint,6,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"`
	// ContentType, if not empty, restricts results to streams with the supplied
	// content type.
	ContentType string                         `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"`
	StreamType  *QueryRequest_StreamTypeFilter `protobuf:"bytes,11,opt,name=stream_type,json=streamType,proto3" json:"stream_type,omitempty"`
	// Newer restricts results to streams created after the specified date.
	Newer *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=newer,proto3" json:"newer,omitempty"`
	// Older restricts results to streams created before the specified date.
	Older *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=older,proto3" json:"older,omitempty"`
	// Tags is the set of tags to constrain the query with.
	//
	// A Tag entry may either be:
	// - A key/value query, in which case the results are constrained by logs
	//   whose tag includes that key/value pair.
	// - A key with an missing (nil) value, in which case the results are
	//   constraints by logs that have that tag key, regardless of its value.
	Tags map[string]string `protobuf:"bytes,15,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Purged restricts the query to streams that have or haven't been purged.
	Purged QueryRequest_Trinary `protobuf:"varint,16,opt,name=purged,proto3,enum=logdog.QueryRequest_Trinary" json:"purged,omitempty"`
}

func (x *QueryRequest) Reset() {
	*x = QueryRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*QueryRequest) ProtoMessage() {}

func (x *QueryRequest) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[3]
	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 QueryRequest.ProtoReflect.Descriptor instead.
func (*QueryRequest) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescGZIP(), []int{3}
}

func (x *QueryRequest) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *QueryRequest) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

func (x *QueryRequest) GetState() bool {
	if x != nil {
		return x.State
	}
	return false
}

func (x *QueryRequest) GetProto() bool {
	if x != nil {
		return x.Proto
	}
	return false
}

func (x *QueryRequest) GetNext() string {
	if x != nil {
		return x.Next
	}
	return ""
}

func (x *QueryRequest) GetMaxResults() int32 {
	if x != nil {
		return x.MaxResults
	}
	return 0
}

func (x *QueryRequest) GetContentType() string {
	if x != nil {
		return x.ContentType
	}
	return ""
}

func (x *QueryRequest) GetStreamType() *QueryRequest_StreamTypeFilter {
	if x != nil {
		return x.StreamType
	}
	return nil
}

func (x *QueryRequest) GetNewer() *timestamppb.Timestamp {
	if x != nil {
		return x.Newer
	}
	return nil
}

func (x *QueryRequest) GetOlder() *timestamppb.Timestamp {
	if x != nil {
		return x.Older
	}
	return nil
}

func (x *QueryRequest) GetTags() map[string]string {
	if x != nil {
		return x.Tags
	}
	return nil
}

func (x *QueryRequest) GetPurged() QueryRequest_Trinary {
	if x != nil {
		return x.Purged
	}
	return QueryRequest_BOTH
}

// QueryResponse is the response structure for the user Query endpoint.
type QueryResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Project is the project name that all responses belong to.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// Realm is the realm (within the project) all streams are associated with.
	Realm string `protobuf:"bytes,4,opt,name=realm,proto3" json:"realm,omitempty"`
	// The list of streams that were identified as the result of the query.
	Streams []*QueryResponse_Stream `protobuf:"bytes,2,rep,name=streams,proto3" json:"streams,omitempty"`
	// If not empty, indicates that there are more query results available.
	// These results can be requested by repeating the Query request with the
	// same Path field and supplying this value in the Next field.
	Next string `protobuf:"bytes,3,opt,name=next,proto3" json:"next,omitempty"`
}

func (x *QueryResponse) Reset() {
	*x = QueryResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*QueryResponse) ProtoMessage() {}

func (x *QueryResponse) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[4]
	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 QueryResponse.ProtoReflect.Descriptor instead.
func (*QueryResponse) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescGZIP(), []int{4}
}

func (x *QueryResponse) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *QueryResponse) GetRealm() string {
	if x != nil {
		return x.Realm
	}
	return ""
}

func (x *QueryResponse) GetStreams() []*QueryResponse_Stream {
	if x != nil {
		return x.Streams
	}
	return nil
}

func (x *QueryResponse) GetNext() string {
	if x != nil {
		return x.Next
	}
	return ""
}

// If supplied, the response will contain a SignedUrls message with the
// requested signed URLs. If signed URLs are not supported by the log's
// current storage system, the response message will be empty.
type GetRequest_SignURLRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The lifetime that the signed URL will be bound to.. The
	Lifetime *durationpb.Duration `protobuf:"bytes,1,opt,name=lifetime,proto3" json:"lifetime,omitempty"`
	// Return a signed URL for the log's RecordIO protobuf data.
	Stream bool `protobuf:"varint,2,opt,name=stream,proto3" json:"stream,omitempty"`
	// Return a signed URL for the log's LogIndex protobuf.
	Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"`
}

func (x *GetRequest_SignURLRequest) Reset() {
	*x = GetRequest_SignURLRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRequest_SignURLRequest) ProtoMessage() {}

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

func (x *GetRequest_SignURLRequest) GetLifetime() *durationpb.Duration {
	if x != nil {
		return x.Lifetime
	}
	return nil
}

func (x *GetRequest_SignURLRequest) GetStream() bool {
	if x != nil {
		return x.Stream
	}
	return false
}

func (x *GetRequest_SignURLRequest) GetIndex() bool {
	if x != nil {
		return x.Index
	}
	return false
}

// Holds information about the log stream's signed entry URL.
type GetResponse_SignedUrls struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The time when this signed URL will expire.
	Expiration *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=expiration,proto3" json:"expiration,omitempty"`
	// The signed log stream URL, if requested.
	Stream string `protobuf:"bytes,2,opt,name=stream,proto3" json:"stream,omitempty"`
	// The signed log index URL, if requested.
	Index string `protobuf:"bytes,3,opt,name=index,proto3" json:"index,omitempty"`
}

func (x *GetResponse_SignedUrls) Reset() {
	*x = GetResponse_SignedUrls{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetResponse_SignedUrls) ProtoMessage() {}

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

func (x *GetResponse_SignedUrls) GetExpiration() *timestamppb.Timestamp {
	if x != nil {
		return x.Expiration
	}
	return nil
}

func (x *GetResponse_SignedUrls) GetStream() string {
	if x != nil {
		return x.Stream
	}
	return ""
}

func (x *GetResponse_SignedUrls) GetIndex() string {
	if x != nil {
		return x.Index
	}
	return ""
}

// The stream type to filter on.
type QueryRequest_StreamTypeFilter struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The StreamType value to filter on.
	Value logpb.StreamType `protobuf:"varint,1,opt,name=value,proto3,enum=logpb.StreamType" json:"value,omitempty"`
}

func (x *QueryRequest_StreamTypeFilter) Reset() {
	*x = QueryRequest_StreamTypeFilter{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*QueryRequest_StreamTypeFilter) ProtoMessage() {}

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

func (x *QueryRequest_StreamTypeFilter) GetValue() logpb.StreamType {
	if x != nil {
		return x.Value
	}
	return logpb.StreamType_TEXT
}

// Stream represents a single query response stream.
type QueryResponse_Stream struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Path is the log stream path.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// State is the log stream descriptor and state for this stream.
	//
	// It can be requested by setting the request's State field to true. If the
	// Proto field is true, the State's Descriptor field will not be included.
	State *LogStreamState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	// The JSON-packed log stream descriptor protobuf.
	//
	// A Descriptor entry corresponds to the Path with the same index.
	//
	// If the query request's State field is set, the descriptor will be
	// populated. If the Proto field is false, Descriptor will be populated;
	// otherwise, DescriptorProto will be populated with the serialized descriptor
	// protobuf.
	Desc *logpb.LogStreamDescriptor `protobuf:"bytes,3,opt,name=desc,proto3" json:"desc,omitempty"`
	// The serialized log stream Descriptor protobuf.
	DescProto []byte `protobuf:"bytes,4,opt,name=desc_proto,json=descProto,proto3" json:"desc_proto,omitempty"`
}

func (x *QueryResponse_Stream) Reset() {
	*x = QueryResponse_Stream{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*QueryResponse_Stream) ProtoMessage() {}

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

func (x *QueryResponse_Stream) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

func (x *QueryResponse_Stream) GetState() *LogStreamState {
	if x != nil {
		return x.State
	}
	return nil
}

func (x *QueryResponse_Stream) GetDesc() *logpb.LogStreamDescriptor {
	if x != nil {
		return x.Desc
	}
	return nil
}

func (x *QueryResponse_Stream) GetDescProto() []byte {
	if x != nil {
		return x.DescProto
	}
	return nil
}

var File_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDesc = []byte{
	0x0a, 0x48, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2f, 0x61, 0x70,
	0x69, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6f, 0x72,
	0x64, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x76, 0x31, 0x2f,
	0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x6c, 0x6f, 0x67, 0x64,
	0x6f, 0x67, 0x1a, 0x49, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e,
	0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2f,
	0x61, 0x70, 0x69, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f,
	0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x76,
	0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c,
	0x75, 0x63, 0x69, 0x2f, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c,
	0x6f, 0x67, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0x8b, 0x03, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,
	0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05,
	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61,
	0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65,
	0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x79,
	0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x63,
	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x43,
	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74,
	0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6e, 0x6f,
	0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x67,
	0x65, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x47, 0x65,
	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x67, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e,
	0x65, 0x64, 0x55, 0x72, 0x6c, 0x73, 0x1a, 0x75, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52,
	0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6c, 0x69, 0x66, 0x65,
	0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12,
	0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x51, 0x0a,
	0x0b, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07,
	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74,
	0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x22, 0xf9, 0x02, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65,
	0x61, 0x6c, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x65, 0x61, 0x6c, 0x6d,
	0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x16, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65,
	0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e,
	0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c,
	0x6f, 0x67, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x65,
	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x23,
	0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6c,
	0x6f, 0x67, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6c,
	0x6f, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72,
	0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f,
	0x67, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x69,
	0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x73, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64,
	0x55, 0x72, 0x6c, 0x73, 0x1a, 0x76, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72,
	0x6c, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
	0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16,
	0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x87, 0x05, 0x0a,
	0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a,
	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73,
	0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d,
	0x61, 0x78, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c,
	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12,
	0x46, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x51, 0x75,
	0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
	0x6d, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x73, 0x74, 0x72,
	0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6e, 0x65, 0x77, 0x65, 0x72,
	0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
	0x6d, 0x70, 0x52, 0x05, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x05, 0x6f, 0x6c, 0x64,
	0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
	0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x04, 0x74,
	0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x6f, 0x67, 0x64,
	0x6f, 0x67, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
	0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
	0x34, 0x0a, 0x06, 0x70, 0x75, 0x72, 0x67, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x1c, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x06, 0x70,
	0x75, 0x72, 0x67, 0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54,
	0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6c, 0x6f, 0x67, 0x70, 0x62,
	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x24, 0x0a, 0x07, 0x54,
	0x72, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x00,
	0x12, 0x07, 0x0a, 0x03, 0x59, 0x45, 0x53, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4f, 0x10,
	0x02, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x76,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
	0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x05, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65,
	0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x6f, 0x67, 0x64,
	0x6f, 0x67, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73,
	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
	0x6e, 0x65, 0x78, 0x74, 0x1a, 0x99, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12,
	0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
	0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53,
	0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1a, 0x2e, 0x6c, 0x6f, 0x67, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61,
	0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x64, 0x65, 0x73,
	0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x73, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x64, 0x65, 0x73, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f,
	0x32, 0x9e, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x03, 0x47, 0x65, 0x74,
	0x12, 0x12, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x47, 0x65,
	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x54, 0x61, 0x69,
	0x6c, 0x12, 0x13, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e,
	0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x51,
	0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x2e, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x2e, 0x51, 0x75,
	0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6c, 0x6f, 0x67,
	0x64, 0x6f, 0x67, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67,
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2f, 0x63,
	0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f,
	0x76, 0x31, 0x3b, 0x6c, 0x6f, 0x67, 0x64, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescData = file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDesc
)

func file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescData)
	})
	return file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDescData
}

var file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_goTypes = []interface{}{
	(QueryRequest_Trinary)(0),             // 0: logdog.QueryRequest.Trinary
	(*GetRequest)(nil),                    // 1: logdog.GetRequest
	(*TailRequest)(nil),                   // 2: logdog.TailRequest
	(*GetResponse)(nil),                   // 3: logdog.GetResponse
	(*QueryRequest)(nil),                  // 4: logdog.QueryRequest
	(*QueryResponse)(nil),                 // 5: logdog.QueryResponse
	(*GetRequest_SignURLRequest)(nil),     // 6: logdog.GetRequest.SignURLRequest
	(*GetResponse_SignedUrls)(nil),        // 7: logdog.GetResponse.SignedUrls
	(*QueryRequest_StreamTypeFilter)(nil), // 8: logdog.QueryRequest.StreamTypeFilter
	nil,                                   // 9: logdog.QueryRequest.TagsEntry
	(*QueryResponse_Stream)(nil),          // 10: logdog.QueryResponse.Stream
	(*LogStreamState)(nil),                // 11: logdog.LogStreamState
	(*logpb.LogStreamDescriptor)(nil),     // 12: logpb.LogStreamDescriptor
	(*logpb.LogEntry)(nil),                // 13: logpb.LogEntry
	(*timestamppb.Timestamp)(nil),         // 14: google.protobuf.Timestamp
	(*durationpb.Duration)(nil),           // 15: google.protobuf.Duration
	(logpb.StreamType)(0),                 // 16: logpb.StreamType
}
var file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_depIdxs = []int32{
	6,  // 0: logdog.GetRequest.get_signed_urls:type_name -> logdog.GetRequest.SignURLRequest
	11, // 1: logdog.GetResponse.state:type_name -> logdog.LogStreamState
	12, // 2: logdog.GetResponse.desc:type_name -> logpb.LogStreamDescriptor
	13, // 3: logdog.GetResponse.logs:type_name -> logpb.LogEntry
	7,  // 4: logdog.GetResponse.signed_urls:type_name -> logdog.GetResponse.SignedUrls
	8,  // 5: logdog.QueryRequest.stream_type:type_name -> logdog.QueryRequest.StreamTypeFilter
	14, // 6: logdog.QueryRequest.newer:type_name -> google.protobuf.Timestamp
	14, // 7: logdog.QueryRequest.older:type_name -> google.protobuf.Timestamp
	9,  // 8: logdog.QueryRequest.tags:type_name -> logdog.QueryRequest.TagsEntry
	0,  // 9: logdog.QueryRequest.purged:type_name -> logdog.QueryRequest.Trinary
	10, // 10: logdog.QueryResponse.streams:type_name -> logdog.QueryResponse.Stream
	15, // 11: logdog.GetRequest.SignURLRequest.lifetime:type_name -> google.protobuf.Duration
	14, // 12: logdog.GetResponse.SignedUrls.expiration:type_name -> google.protobuf.Timestamp
	16, // 13: logdog.QueryRequest.StreamTypeFilter.value:type_name -> logpb.StreamType
	11, // 14: logdog.QueryResponse.Stream.state:type_name -> logdog.LogStreamState
	12, // 15: logdog.QueryResponse.Stream.desc:type_name -> logpb.LogStreamDescriptor
	1,  // 16: logdog.Logs.Get:input_type -> logdog.GetRequest
	2,  // 17: logdog.Logs.Tail:input_type -> logdog.TailRequest
	4,  // 18: logdog.Logs.Query:input_type -> logdog.QueryRequest
	3,  // 19: logdog.Logs.Get:output_type -> logdog.GetResponse
	3,  // 20: logdog.Logs.Tail:output_type -> logdog.GetResponse
	5,  // 21: logdog.Logs.Query:output_type -> logdog.QueryResponse
	19, // [19:22] is the sub-list for method output_type
	16, // [16:19] is the sub-list for method input_type
	16, // [16:16] is the sub-list for extension type_name
	16, // [16:16] is the sub-list for extension extendee
	0,  // [0:16] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_init() }
func file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_init() {
	if File_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto != nil {
		return
	}
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_state_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TailRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*QueryRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*QueryResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRequest_SignURLRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetResponse_SignedUrls); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*QueryRequest_StreamTypeFilter); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*QueryResponse_Stream); 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_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   10,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_depIdxs,
		EnumInfos:         file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_enumTypes,
		MessageInfos:      file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto = out.File
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_rawDesc = nil
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_goTypes = nil
	file_go_chromium_org_luci_logdog_api_endpoints_coordinator_logs_v1_logs_proto_depIdxs = nil
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// LogsClient is the client API for Logs service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type LogsClient interface {
	// Get returns state and log data for a single log stream.
	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
	// Tail returns the last log in the log stream at the time of the request.
	Tail(ctx context.Context, in *TailRequest, opts ...grpc.CallOption) (*GetResponse, error)
	// Query returns log stream paths that match the requested query.
	Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error)
}
type logsPRPCClient struct {
	client *prpc.Client
}

func NewLogsPRPCClient(client *prpc.Client) LogsClient {
	return &logsPRPCClient{client}
}

func (c *logsPRPCClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.client.Call(ctx, "logdog.Logs", "Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *logsPRPCClient) Tail(ctx context.Context, in *TailRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.client.Call(ctx, "logdog.Logs", "Tail", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *logsPRPCClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) {
	out := new(QueryResponse)
	err := c.client.Call(ctx, "logdog.Logs", "Query", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

type logsClient struct {
	cc grpc.ClientConnInterface
}

func NewLogsClient(cc grpc.ClientConnInterface) LogsClient {
	return &logsClient{cc}
}

func (c *logsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.cc.Invoke(ctx, "/logdog.Logs/Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *logsClient) Tail(ctx context.Context, in *TailRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.cc.Invoke(ctx, "/logdog.Logs/Tail", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *logsClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*QueryResponse, error) {
	out := new(QueryResponse)
	err := c.cc.Invoke(ctx, "/logdog.Logs/Query", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// LogsServer is the server API for Logs service.
type LogsServer interface {
	// Get returns state and log data for a single log stream.
	Get(context.Context, *GetRequest) (*GetResponse, error)
	// Tail returns the last log in the log stream at the time of the request.
	Tail(context.Context, *TailRequest) (*GetResponse, error)
	// Query returns log stream paths that match the requested query.
	Query(context.Context, *QueryRequest) (*QueryResponse, error)
}

// UnimplementedLogsServer can be embedded to have forward compatible implementations.
type UnimplementedLogsServer struct {
}

func (*UnimplementedLogsServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
}
func (*UnimplementedLogsServer) Tail(context.Context, *TailRequest) (*GetResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Tail not implemented")
}
func (*UnimplementedLogsServer) Query(context.Context, *QueryRequest) (*QueryResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
}

func RegisterLogsServer(s prpc.Registrar, srv LogsServer) {
	s.RegisterService(&_Logs_serviceDesc, srv)
}

func _Logs_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LogsServer).Get(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Logs/Get",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LogsServer).Get(ctx, req.(*GetRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Logs_Tail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TailRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LogsServer).Tail(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Logs/Tail",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LogsServer).Tail(ctx, req.(*TailRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Logs_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(QueryRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LogsServer).Query(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Logs/Query",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LogsServer).Query(ctx, req.(*QueryRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Logs_serviceDesc = grpc.ServiceDesc{
	ServiceName: "logdog.Logs",
	HandlerType: (*LogsServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Get",
			Handler:    _Logs_Get_Handler,
		},
		{
			MethodName: "Tail",
			Handler:    _Logs_Tail_Handler,
		},
		{
			MethodName: "Query",
			Handler:    _Logs_Query_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "go.chromium.org/luci/logdog/api/endpoints/coordinator/logs/v1/logs.proto",
}
