// Copyright 2016 The Vanadium 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.
// source: rpc.proto
// DO NOT EDIT!

/*
Package benchmark is a generated protocol buffer package.

It is generated from these files:
	rpc.proto

It has these top-level messages:
	TimeTime
	VtraceAnnotation
	VtraceSpanRecord
	VtraceTraceRecord
	VtraceResponse
	RpcResponse
	TimeDuration
	TimeWireDeadline
	Signature
	Caveat
	Certificate
	CertificateChain
	SecurityWireBlessings
	VtraceRequest
	RpcRequest
*/

package benchmark

import proto "github.com/golang/protobuf/proto"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = math.Inf

type TimeTime struct {
	Seconds          *int64 `protobuf:"varint,1,req,name=seconds" json:"seconds,omitempty"`
	Nanos            *int32 `protobuf:"varint,2,req,name=nanos" json:"nanos,omitempty"`
	XXX_unrecognized []byte `json:"-"`
}

func (m *TimeTime) Reset()         { *m = TimeTime{} }
func (m *TimeTime) String() string { return proto.CompactTextString(m) }
func (*TimeTime) ProtoMessage()    {}

func (m *TimeTime) GetSeconds() int64 {
	if m != nil && m.Seconds != nil {
		return *m.Seconds
	}
	return 0
}

func (m *TimeTime) GetNanos() int32 {
	if m != nil && m.Nanos != nil {
		return *m.Nanos
	}
	return 0
}

type VtraceAnnotation struct {
	When             *TimeTime `protobuf:"bytes,1,req,name=when" json:"when,omitempty"`
	Msg              *string   `protobuf:"bytes,2,req,name=msg" json:"msg,omitempty"`
	XXX_unrecognized []byte    `json:"-"`
}

func (m *VtraceAnnotation) Reset()         { *m = VtraceAnnotation{} }
func (m *VtraceAnnotation) String() string { return proto.CompactTextString(m) }
func (*VtraceAnnotation) ProtoMessage()    {}

func (m *VtraceAnnotation) GetWhen() *TimeTime {
	if m != nil {
		return m.When
	}
	return nil
}

func (m *VtraceAnnotation) GetMsg() string {
	if m != nil && m.Msg != nil {
		return *m.Msg
	}
	return ""
}

type VtraceSpanRecord struct {
	Id               []byte              `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
	Parent           []byte              `protobuf:"bytes,2,req,name=parent" json:"parent,omitempty"`
	Name             *string             `protobuf:"bytes,3,req,name=name" json:"name,omitempty"`
	Start            *TimeTime           `protobuf:"bytes,4,req,name=start" json:"start,omitempty"`
	End              *TimeTime           `protobuf:"bytes,5,req,name=end" json:"end,omitempty"`
	Annotations      []*VtraceAnnotation `protobuf:"bytes,6,rep,name=annotations" json:"annotations,omitempty"`
	XXX_unrecognized []byte              `json:"-"`
}

func (m *VtraceSpanRecord) Reset()         { *m = VtraceSpanRecord{} }
func (m *VtraceSpanRecord) String() string { return proto.CompactTextString(m) }
func (*VtraceSpanRecord) ProtoMessage()    {}

func (m *VtraceSpanRecord) GetId() []byte {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *VtraceSpanRecord) GetParent() []byte {
	if m != nil {
		return m.Parent
	}
	return nil
}

func (m *VtraceSpanRecord) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *VtraceSpanRecord) GetStart() *TimeTime {
	if m != nil {
		return m.Start
	}
	return nil
}

func (m *VtraceSpanRecord) GetEnd() *TimeTime {
	if m != nil {
		return m.End
	}
	return nil
}

func (m *VtraceSpanRecord) GetAnnotations() []*VtraceAnnotation {
	if m != nil {
		return m.Annotations
	}
	return nil
}

type VtraceTraceRecord struct {
	Id               []byte              `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
	SpanRecord       []*VtraceSpanRecord `protobuf:"bytes,2,rep,name=spanRecord" json:"spanRecord,omitempty"`
	XXX_unrecognized []byte              `json:"-"`
}

func (m *VtraceTraceRecord) Reset()         { *m = VtraceTraceRecord{} }
func (m *VtraceTraceRecord) String() string { return proto.CompactTextString(m) }
func (*VtraceTraceRecord) ProtoMessage()    {}

func (m *VtraceTraceRecord) GetId() []byte {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *VtraceTraceRecord) GetSpanRecord() []*VtraceSpanRecord {
	if m != nil {
		return m.SpanRecord
	}
	return nil
}

type VtraceResponse struct {
	TraceFlags       *int32             `protobuf:"varint,1,req,name=traceFlags" json:"traceFlags,omitempty"`
	Trace            *VtraceTraceRecord `protobuf:"bytes,2,req,name=trace" json:"trace,omitempty"`
	XXX_unrecognized []byte             `json:"-"`
}

func (m *VtraceResponse) Reset()         { *m = VtraceResponse{} }
func (m *VtraceResponse) String() string { return proto.CompactTextString(m) }
func (*VtraceResponse) ProtoMessage()    {}

func (m *VtraceResponse) GetTraceFlags() int32 {
	if m != nil && m.TraceFlags != nil {
		return *m.TraceFlags
	}
	return 0
}

func (m *VtraceResponse) GetTrace() *VtraceTraceRecord {
	if m != nil {
		return m.Trace
	}
	return nil
}

type RpcResponse struct {
	Error            *string         `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"`
	EndStreamResults *bool           `protobuf:"varint,2,req,name=endStreamResults" json:"endStreamResults,omitempty"`
	NumPosResults    *uint64         `protobuf:"varint,3,req,name=numPosResults" json:"numPosResults,omitempty"`
	TraceResponse    *VtraceResponse `protobuf:"bytes,4,req,name=traceResponse" json:"traceResponse,omitempty"`
	AckBlessings     *bool           `protobuf:"varint,5,req,name=ackBlessings" json:"ackBlessings,omitempty"`
	XXX_unrecognized []byte          `json:"-"`
}

func (m *RpcResponse) Reset()         { *m = RpcResponse{} }
func (m *RpcResponse) String() string { return proto.CompactTextString(m) }
func (*RpcResponse) ProtoMessage()    {}

func (m *RpcResponse) GetError() string {
	if m != nil && m.Error != nil {
		return *m.Error
	}
	return ""
}

func (m *RpcResponse) GetEndStreamResults() bool {
	if m != nil && m.EndStreamResults != nil {
		return *m.EndStreamResults
	}
	return false
}

func (m *RpcResponse) GetNumPosResults() uint64 {
	if m != nil && m.NumPosResults != nil {
		return *m.NumPosResults
	}
	return 0
}

func (m *RpcResponse) GetTraceResponse() *VtraceResponse {
	if m != nil {
		return m.TraceResponse
	}
	return nil
}

func (m *RpcResponse) GetAckBlessings() bool {
	if m != nil && m.AckBlessings != nil {
		return *m.AckBlessings
	}
	return false
}

type TimeDuration struct {
	Seconds          *int64 `protobuf:"varint,1,req,name=seconds" json:"seconds,omitempty"`
	Nanos            *int64 `protobuf:"varint,2,req,name=nanos" json:"nanos,omitempty"`
	XXX_unrecognized []byte `json:"-"`
}

func (m *TimeDuration) Reset()         { *m = TimeDuration{} }
func (m *TimeDuration) String() string { return proto.CompactTextString(m) }
func (*TimeDuration) ProtoMessage()    {}

func (m *TimeDuration) GetSeconds() int64 {
	if m != nil && m.Seconds != nil {
		return *m.Seconds
	}
	return 0
}

func (m *TimeDuration) GetNanos() int64 {
	if m != nil && m.Nanos != nil {
		return *m.Nanos
	}
	return 0
}

type TimeWireDeadline struct {
	FromNow          *TimeDuration `protobuf:"bytes,1,req,name=fromNow" json:"fromNow,omitempty"`
	NoDeadline       *bool         `protobuf:"varint,2,req,name=noDeadline" json:"noDeadline,omitempty"`
	XXX_unrecognized []byte        `json:"-"`
}

func (m *TimeWireDeadline) Reset()         { *m = TimeWireDeadline{} }
func (m *TimeWireDeadline) String() string { return proto.CompactTextString(m) }
func (*TimeWireDeadline) ProtoMessage()    {}

func (m *TimeWireDeadline) GetFromNow() *TimeDuration {
	if m != nil {
		return m.FromNow
	}
	return nil
}

func (m *TimeWireDeadline) GetNoDeadline() bool {
	if m != nil && m.NoDeadline != nil {
		return *m.NoDeadline
	}
	return false
}

type Signature struct {
	Purpose          []byte  `protobuf:"bytes,1,req,name=purpose" json:"purpose,omitempty"`
	Hash             *string `protobuf:"bytes,2,req,name=hash" json:"hash,omitempty"`
	R                []byte  `protobuf:"bytes,3,req,name=r" json:"r,omitempty"`
	S                []byte  `protobuf:"bytes,4,req,name=s" json:"s,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *Signature) Reset()         { *m = Signature{} }
func (m *Signature) String() string { return proto.CompactTextString(m) }
func (*Signature) ProtoMessage()    {}

func (m *Signature) GetPurpose() []byte {
	if m != nil {
		return m.Purpose
	}
	return nil
}

func (m *Signature) GetHash() string {
	if m != nil && m.Hash != nil {
		return *m.Hash
	}
	return ""
}

func (m *Signature) GetR() []byte {
	if m != nil {
		return m.R
	}
	return nil
}

func (m *Signature) GetS() []byte {
	if m != nil {
		return m.S
	}
	return nil
}

type Caveat struct {
	Id               []byte `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
	ParamVom         []byte `protobuf:"bytes,2,req,name=paramVom" json:"paramVom,omitempty"`
	XXX_unrecognized []byte `json:"-"`
}

func (m *Caveat) Reset()         { *m = Caveat{} }
func (m *Caveat) String() string { return proto.CompactTextString(m) }
func (*Caveat) ProtoMessage()    {}

func (m *Caveat) GetId() []byte {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *Caveat) GetParamVom() []byte {
	if m != nil {
		return m.ParamVom
	}
	return nil
}

type Certificate struct {
	Extension        *string    `protobuf:"bytes,1,req,name=extension" json:"extension,omitempty"`
	PublicKey        []byte     `protobuf:"bytes,2,req,name=publicKey" json:"publicKey,omitempty"`
	Caveats          []*Caveat  `protobuf:"bytes,3,rep,name=caveats" json:"caveats,omitempty"`
	Signature        *Signature `protobuf:"bytes,4,req,name=signature" json:"signature,omitempty"`
	XXX_unrecognized []byte     `json:"-"`
}

func (m *Certificate) Reset()         { *m = Certificate{} }
func (m *Certificate) String() string { return proto.CompactTextString(m) }
func (*Certificate) ProtoMessage()    {}

func (m *Certificate) GetExtension() string {
	if m != nil && m.Extension != nil {
		return *m.Extension
	}
	return ""
}

func (m *Certificate) GetPublicKey() []byte {
	if m != nil {
		return m.PublicKey
	}
	return nil
}

func (m *Certificate) GetCaveats() []*Caveat {
	if m != nil {
		return m.Caveats
	}
	return nil
}

func (m *Certificate) GetSignature() *Signature {
	if m != nil {
		return m.Signature
	}
	return nil
}

type CertificateChain struct {
	Certificates     []*Certificate `protobuf:"bytes,1,rep,name=certificates" json:"certificates,omitempty"`
	XXX_unrecognized []byte         `json:"-"`
}

func (m *CertificateChain) Reset()         { *m = CertificateChain{} }
func (m *CertificateChain) String() string { return proto.CompactTextString(m) }
func (*CertificateChain) ProtoMessage()    {}

func (m *CertificateChain) GetCertificates() []*Certificate {
	if m != nil {
		return m.Certificates
	}
	return nil
}

type SecurityWireBlessings struct {
	CertificateChains []*CertificateChain `protobuf:"bytes,1,rep,name=certificateChains" json:"certificateChains,omitempty"`
	XXX_unrecognized  []byte              `json:"-"`
}

func (m *SecurityWireBlessings) Reset()         { *m = SecurityWireBlessings{} }
func (m *SecurityWireBlessings) String() string { return proto.CompactTextString(m) }
func (*SecurityWireBlessings) ProtoMessage()    {}

func (m *SecurityWireBlessings) GetCertificateChains() []*CertificateChain {
	if m != nil {
		return m.CertificateChains
	}
	return nil
}

type VtraceRequest struct {
	SpanId           []byte `protobuf:"bytes,1,req,name=spanId" json:"spanId,omitempty"`
	TraceId          []byte `protobuf:"bytes,2,req,name=traceId" json:"traceId,omitempty"`
	Flags            *int32 `protobuf:"varint,3,req,name=flags" json:"flags,omitempty"`
	LogLevel         *int32 `protobuf:"varint,4,req,name=logLevel" json:"logLevel,omitempty"`
	XXX_unrecognized []byte `json:"-"`
}

func (m *VtraceRequest) Reset()         { *m = VtraceRequest{} }
func (m *VtraceRequest) String() string { return proto.CompactTextString(m) }
func (*VtraceRequest) ProtoMessage()    {}

func (m *VtraceRequest) GetSpanId() []byte {
	if m != nil {
		return m.SpanId
	}
	return nil
}

func (m *VtraceRequest) GetTraceId() []byte {
	if m != nil {
		return m.TraceId
	}
	return nil
}

func (m *VtraceRequest) GetFlags() int32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return 0
}

func (m *VtraceRequest) GetLogLevel() int32 {
	if m != nil && m.LogLevel != nil {
		return *m.LogLevel
	}
	return 0
}

type RpcRequest struct {
	Suffix           *string                `protobuf:"bytes,1,req,name=suffix" json:"suffix,omitempty"`
	Method           *string                `protobuf:"bytes,2,req,name=method" json:"method,omitempty"`
	NumPosArgs       *uint64                `protobuf:"varint,3,req,name=numPosArgs" json:"numPosArgs,omitempty"`
	EndStreamArgs    *bool                  `protobuf:"varint,4,req,name=endStreamArgs" json:"endStreamArgs,omitempty"`
	Deadline         *TimeWireDeadline      `protobuf:"bytes,5,req,name=deadline" json:"deadline,omitempty"`
	GrantedBlessings *SecurityWireBlessings `protobuf:"bytes,6,req,name=grantedBlessings" json:"grantedBlessings,omitempty"`
	TraceRequest     *VtraceRequest         `protobuf:"bytes,7,req,name=traceRequest" json:"traceRequest,omitempty"`
	Language         *string                `protobuf:"bytes,8,req,name=language" json:"language,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

func (m *RpcRequest) Reset()         { *m = RpcRequest{} }
func (m *RpcRequest) String() string { return proto.CompactTextString(m) }
func (*RpcRequest) ProtoMessage()    {}

func (m *RpcRequest) GetSuffix() string {
	if m != nil && m.Suffix != nil {
		return *m.Suffix
	}
	return ""
}

func (m *RpcRequest) GetMethod() string {
	if m != nil && m.Method != nil {
		return *m.Method
	}
	return ""
}

func (m *RpcRequest) GetNumPosArgs() uint64 {
	if m != nil && m.NumPosArgs != nil {
		return *m.NumPosArgs
	}
	return 0
}

func (m *RpcRequest) GetEndStreamArgs() bool {
	if m != nil && m.EndStreamArgs != nil {
		return *m.EndStreamArgs
	}
	return false
}

func (m *RpcRequest) GetDeadline() *TimeWireDeadline {
	if m != nil {
		return m.Deadline
	}
	return nil
}

func (m *RpcRequest) GetGrantedBlessings() *SecurityWireBlessings {
	if m != nil {
		return m.GrantedBlessings
	}
	return nil
}

func (m *RpcRequest) GetTraceRequest() *VtraceRequest {
	if m != nil {
		return m.TraceRequest
	}
	return nil
}

func (m *RpcRequest) GetLanguage() string {
	if m != nil && m.Language != nil {
		return *m.Language
	}
	return ""
}

func init() {
}
