// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test/custom_results/graphics/trace_id.proto

package graphics

import (
	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)
)

// Uniquely identifies a trace used for replay tests.
type TraceId struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*TraceId) ProtoMessage() {}

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

func (x *TraceId) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

var File_test_custom_results_graphics_trace_id_proto protoreflect.FileDescriptor

var file_test_custom_results_graphics_trace_id_proto_rawDesc = []byte{
	0x0a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2f, 0x74,
	0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x74,
	0x65, 0x73, 0x74, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x54,
	0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x48, 0x5a, 0x46,
	0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63,
	0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72,
	0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_custom_results_graphics_trace_id_proto_rawDescOnce sync.Once
	file_test_custom_results_graphics_trace_id_proto_rawDescData = file_test_custom_results_graphics_trace_id_proto_rawDesc
)

func file_test_custom_results_graphics_trace_id_proto_rawDescGZIP() []byte {
	file_test_custom_results_graphics_trace_id_proto_rawDescOnce.Do(func() {
		file_test_custom_results_graphics_trace_id_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_custom_results_graphics_trace_id_proto_rawDescData)
	})
	return file_test_custom_results_graphics_trace_id_proto_rawDescData
}

var file_test_custom_results_graphics_trace_id_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_custom_results_graphics_trace_id_proto_goTypes = []interface{}{
	(*TraceId)(nil), // 0: test.custom_results.graphics.TraceId
}
var file_test_custom_results_graphics_trace_id_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_test_custom_results_graphics_trace_id_proto_init() }
func file_test_custom_results_graphics_trace_id_proto_init() {
	if File_test_custom_results_graphics_trace_id_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_custom_results_graphics_trace_id_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TraceId); 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_test_custom_results_graphics_trace_id_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_custom_results_graphics_trace_id_proto_goTypes,
		DependencyIndexes: file_test_custom_results_graphics_trace_id_proto_depIdxs,
		MessageInfos:      file_test_custom_results_graphics_trace_id_proto_msgTypes,
	}.Build()
	File_test_custom_results_graphics_trace_id_proto = out.File
	file_test_custom_results_graphics_trace_id_proto_rawDesc = nil
	file_test_custom_results_graphics_trace_id_proto_goTypes = nil
	file_test_custom_results_graphics_trace_id_proto_depIdxs = nil
}
