// Code generated by protoc-gen-go. DO NOT EDIT.
// source: kythe/proto/filetree.proto

package filetree_go_proto

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

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

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type DirectoryReply_Kind int32

const (
	DirectoryReply_UNKNOWN   DirectoryReply_Kind = 0
	DirectoryReply_FILE      DirectoryReply_Kind = 1
	DirectoryReply_DIRECTORY DirectoryReply_Kind = 2
)

var DirectoryReply_Kind_name = map[int32]string{
	0: "UNKNOWN",
	1: "FILE",
	2: "DIRECTORY",
}

var DirectoryReply_Kind_value = map[string]int32{
	"UNKNOWN":   0,
	"FILE":      1,
	"DIRECTORY": 2,
}

func (x DirectoryReply_Kind) String() string {
	return proto.EnumName(DirectoryReply_Kind_name, int32(x))
}

func (DirectoryReply_Kind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{3, 0}
}

type CorpusRootsRequest struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CorpusRootsRequest) Reset()         { *m = CorpusRootsRequest{} }
func (m *CorpusRootsRequest) String() string { return proto.CompactTextString(m) }
func (*CorpusRootsRequest) ProtoMessage()    {}
func (*CorpusRootsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{0}
}

func (m *CorpusRootsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CorpusRootsRequest.Unmarshal(m, b)
}
func (m *CorpusRootsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CorpusRootsRequest.Marshal(b, m, deterministic)
}
func (m *CorpusRootsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CorpusRootsRequest.Merge(m, src)
}
func (m *CorpusRootsRequest) XXX_Size() int {
	return xxx_messageInfo_CorpusRootsRequest.Size(m)
}
func (m *CorpusRootsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CorpusRootsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CorpusRootsRequest proto.InternalMessageInfo

type CorpusRootsReply struct {
	Corpus               []*CorpusRootsReply_Corpus `protobuf:"bytes,1,rep,name=corpus,proto3" json:"corpus,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *CorpusRootsReply) Reset()         { *m = CorpusRootsReply{} }
func (m *CorpusRootsReply) String() string { return proto.CompactTextString(m) }
func (*CorpusRootsReply) ProtoMessage()    {}
func (*CorpusRootsReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{1}
}

func (m *CorpusRootsReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CorpusRootsReply.Unmarshal(m, b)
}
func (m *CorpusRootsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CorpusRootsReply.Marshal(b, m, deterministic)
}
func (m *CorpusRootsReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CorpusRootsReply.Merge(m, src)
}
func (m *CorpusRootsReply) XXX_Size() int {
	return xxx_messageInfo_CorpusRootsReply.Size(m)
}
func (m *CorpusRootsReply) XXX_DiscardUnknown() {
	xxx_messageInfo_CorpusRootsReply.DiscardUnknown(m)
}

var xxx_messageInfo_CorpusRootsReply proto.InternalMessageInfo

func (m *CorpusRootsReply) GetCorpus() []*CorpusRootsReply_Corpus {
	if m != nil {
		return m.Corpus
	}
	return nil
}

type CorpusRootsReply_Corpus struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Root                 []string `protobuf:"bytes,2,rep,name=root,proto3" json:"root,omitempty"`
	BuildConfig          []string `protobuf:"bytes,3,rep,name=build_config,json=buildConfig,proto3" json:"build_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CorpusRootsReply_Corpus) Reset()         { *m = CorpusRootsReply_Corpus{} }
func (m *CorpusRootsReply_Corpus) String() string { return proto.CompactTextString(m) }
func (*CorpusRootsReply_Corpus) ProtoMessage()    {}
func (*CorpusRootsReply_Corpus) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{1, 0}
}

func (m *CorpusRootsReply_Corpus) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CorpusRootsReply_Corpus.Unmarshal(m, b)
}
func (m *CorpusRootsReply_Corpus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CorpusRootsReply_Corpus.Marshal(b, m, deterministic)
}
func (m *CorpusRootsReply_Corpus) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CorpusRootsReply_Corpus.Merge(m, src)
}
func (m *CorpusRootsReply_Corpus) XXX_Size() int {
	return xxx_messageInfo_CorpusRootsReply_Corpus.Size(m)
}
func (m *CorpusRootsReply_Corpus) XXX_DiscardUnknown() {
	xxx_messageInfo_CorpusRootsReply_Corpus.DiscardUnknown(m)
}

var xxx_messageInfo_CorpusRootsReply_Corpus proto.InternalMessageInfo

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

func (m *CorpusRootsReply_Corpus) GetRoot() []string {
	if m != nil {
		return m.Root
	}
	return nil
}

func (m *CorpusRootsReply_Corpus) GetBuildConfig() []string {
	if m != nil {
		return m.BuildConfig
	}
	return nil
}

type DirectoryRequest struct {
	Corpus               string   `protobuf:"bytes,1,opt,name=corpus,proto3" json:"corpus,omitempty"`
	Root                 string   `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
	Path                 string   `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DirectoryRequest) Reset()         { *m = DirectoryRequest{} }
func (m *DirectoryRequest) String() string { return proto.CompactTextString(m) }
func (*DirectoryRequest) ProtoMessage()    {}
func (*DirectoryRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{2}
}

func (m *DirectoryRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DirectoryRequest.Unmarshal(m, b)
}
func (m *DirectoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DirectoryRequest.Marshal(b, m, deterministic)
}
func (m *DirectoryRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DirectoryRequest.Merge(m, src)
}
func (m *DirectoryRequest) XXX_Size() int {
	return xxx_messageInfo_DirectoryRequest.Size(m)
}
func (m *DirectoryRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_DirectoryRequest.DiscardUnknown(m)
}

var xxx_messageInfo_DirectoryRequest proto.InternalMessageInfo

func (m *DirectoryRequest) GetCorpus() string {
	if m != nil {
		return m.Corpus
	}
	return ""
}

func (m *DirectoryRequest) GetRoot() string {
	if m != nil {
		return m.Root
	}
	return ""
}

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

type DirectoryReply struct {
	Corpus               string                  `protobuf:"bytes,3,opt,name=corpus,proto3" json:"corpus,omitempty"`
	Root                 string                  `protobuf:"bytes,4,opt,name=root,proto3" json:"root,omitempty"`
	Path                 string                  `protobuf:"bytes,5,opt,name=path,proto3" json:"path,omitempty"`
	Entry                []*DirectoryReply_Entry `protobuf:"bytes,6,rep,name=entry,proto3" json:"entry,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *DirectoryReply) Reset()         { *m = DirectoryReply{} }
func (m *DirectoryReply) String() string { return proto.CompactTextString(m) }
func (*DirectoryReply) ProtoMessage()    {}
func (*DirectoryReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{3}
}

func (m *DirectoryReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DirectoryReply.Unmarshal(m, b)
}
func (m *DirectoryReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DirectoryReply.Marshal(b, m, deterministic)
}
func (m *DirectoryReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DirectoryReply.Merge(m, src)
}
func (m *DirectoryReply) XXX_Size() int {
	return xxx_messageInfo_DirectoryReply.Size(m)
}
func (m *DirectoryReply) XXX_DiscardUnknown() {
	xxx_messageInfo_DirectoryReply.DiscardUnknown(m)
}

var xxx_messageInfo_DirectoryReply proto.InternalMessageInfo

func (m *DirectoryReply) GetCorpus() string {
	if m != nil {
		return m.Corpus
	}
	return ""
}

func (m *DirectoryReply) GetRoot() string {
	if m != nil {
		return m.Root
	}
	return ""
}

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

func (m *DirectoryReply) GetEntry() []*DirectoryReply_Entry {
	if m != nil {
		return m.Entry
	}
	return nil
}

type DirectoryReply_Entry struct {
	Kind                 DirectoryReply_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=kythe.proto.DirectoryReply_Kind" json:"kind,omitempty"`
	Name                 string              `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	BuildConfig          []string            `protobuf:"bytes,3,rep,name=build_config,json=buildConfig,proto3" json:"build_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *DirectoryReply_Entry) Reset()         { *m = DirectoryReply_Entry{} }
func (m *DirectoryReply_Entry) String() string { return proto.CompactTextString(m) }
func (*DirectoryReply_Entry) ProtoMessage()    {}
func (*DirectoryReply_Entry) Descriptor() ([]byte, []int) {
	return fileDescriptor_a7cc7eba6fded8b6, []int{3, 0}
}

func (m *DirectoryReply_Entry) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DirectoryReply_Entry.Unmarshal(m, b)
}
func (m *DirectoryReply_Entry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DirectoryReply_Entry.Marshal(b, m, deterministic)
}
func (m *DirectoryReply_Entry) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DirectoryReply_Entry.Merge(m, src)
}
func (m *DirectoryReply_Entry) XXX_Size() int {
	return xxx_messageInfo_DirectoryReply_Entry.Size(m)
}
func (m *DirectoryReply_Entry) XXX_DiscardUnknown() {
	xxx_messageInfo_DirectoryReply_Entry.DiscardUnknown(m)
}

var xxx_messageInfo_DirectoryReply_Entry proto.InternalMessageInfo

func (m *DirectoryReply_Entry) GetKind() DirectoryReply_Kind {
	if m != nil {
		return m.Kind
	}
	return DirectoryReply_UNKNOWN
}

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

func (m *DirectoryReply_Entry) GetBuildConfig() []string {
	if m != nil {
		return m.BuildConfig
	}
	return nil
}

func init() {
	proto.RegisterEnum("kythe.proto.DirectoryReply_Kind", DirectoryReply_Kind_name, DirectoryReply_Kind_value)
	proto.RegisterType((*CorpusRootsRequest)(nil), "kythe.proto.CorpusRootsRequest")
	proto.RegisterType((*CorpusRootsReply)(nil), "kythe.proto.CorpusRootsReply")
	proto.RegisterType((*CorpusRootsReply_Corpus)(nil), "kythe.proto.CorpusRootsReply.Corpus")
	proto.RegisterType((*DirectoryRequest)(nil), "kythe.proto.DirectoryRequest")
	proto.RegisterType((*DirectoryReply)(nil), "kythe.proto.DirectoryReply")
	proto.RegisterType((*DirectoryReply_Entry)(nil), "kythe.proto.DirectoryReply.Entry")
}

func init() { proto.RegisterFile("kythe/proto/filetree.proto", fileDescriptor_a7cc7eba6fded8b6) }

var fileDescriptor_a7cc7eba6fded8b6 = []byte{
	// 435 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0xd3, 0x40,
	0x10, 0x86, 0xb3, 0xb6, 0x13, 0x9a, 0x31, 0x14, 0x33, 0x42, 0xc8, 0x0a, 0xaa, 0x9a, 0x5a, 0x1c,
	0x7a, 0x40, 0xae, 0x14, 0x2a, 0x71, 0xe1, 0x44, 0x9a, 0x4a, 0xa1, 0x28, 0x91, 0xb6, 0x45, 0x08,
	0x2e, 0x51, 0xeb, 0x4c, 0xdd, 0x55, 0x5d, 0xaf, 0x59, 0x6f, 0x2a, 0xf9, 0x81, 0x38, 0xf2, 0x00,
	0xbc, 0x1d, 0xda, 0x75, 0x9a, 0x3a, 0xa8, 0x8d, 0x7a, 0xb1, 0x77, 0xbe, 0x9d, 0xfd, 0x67, 0xe7,
	0xf7, 0x18, 0x7a, 0xd7, 0x95, 0xbe, 0xa2, 0x83, 0x42, 0x49, 0x2d, 0x0f, 0x2e, 0x45, 0x46, 0x5a,
	0x11, 0xc5, 0x36, 0x44, 0xdf, 0xee, 0xd5, 0x41, 0xf4, 0x1a, 0x70, 0x28, 0x55, 0xb1, 0x28, 0xb9,
	0x94, 0xba, 0xe4, 0xf4, 0x6b, 0x41, 0xa5, 0x8e, 0x7e, 0x33, 0x08, 0xd6, 0x70, 0x91, 0x55, 0xf8,
	0x09, 0x3a, 0x89, 0x65, 0x21, 0xeb, 0xbb, 0xfb, 0xfe, 0xe0, 0x5d, 0xdc, 0x10, 0x8a, 0xff, 0x4f,
	0xbf, 0x03, 0xcb, 0x33, 0xbd, 0x53, 0xe8, 0xd4, 0x04, 0x11, 0xbc, 0xfc, 0xfc, 0x86, 0x42, 0xd6,
	0x67, 0xfb, 0x5d, 0x6e, 0xd7, 0x86, 0x29, 0x29, 0x75, 0xe8, 0xf4, 0x5d, 0xc3, 0xcc, 0x1a, 0xf7,
	0xe0, 0xf9, 0xc5, 0x42, 0x64, 0xf3, 0x59, 0x22, 0xf3, 0x4b, 0x91, 0x86, 0xae, 0xdd, 0xf3, 0x2d,
	0x1b, 0x5a, 0x14, 0x71, 0x08, 0x8e, 0x84, 0xa2, 0x44, 0x4b, 0x55, 0x2d, 0xef, 0x8e, 0x6f, 0x1a,
	0xd7, 0x34, 0x05, 0x96, 0x51, 0xa3, 0x04, 0x5b, 0x95, 0x40, 0xf0, 0x8a, 0x73, 0x7d, 0x15, 0xba,
	0x35, 0x33, 0xeb, 0xe8, 0xaf, 0x03, 0xdb, 0x0d, 0x51, 0xd3, 0xf9, 0xbd, 0xa4, 0xfb, 0xa0, 0xa4,
	0xf7, 0x80, 0x64, 0xfb, 0x5e, 0x12, 0x3f, 0x42, 0x9b, 0x72, 0xad, 0xaa, 0xb0, 0x63, 0x8d, 0xdb,
	0x5b, 0x33, 0x6e, 0xbd, 0x56, 0x3c, 0x32, 0x89, 0xbc, 0xce, 0xef, 0x69, 0x68, 0xdb, 0x18, 0x0f,
	0xc1, 0xbb, 0x16, 0xf9, 0xdc, 0xb6, 0xb4, 0x3d, 0xe8, 0x6f, 0x12, 0x38, 0x11, 0xf9, 0x9c, 0xdb,
	0xec, 0x95, 0xd3, 0x4e, 0xc3, 0xe9, 0x27, 0xb8, 0xfa, 0x1e, 0x3c, 0x23, 0x82, 0x3e, 0x3c, 0xfb,
	0x36, 0x39, 0x99, 0x4c, 0xbf, 0x4f, 0x82, 0x16, 0x6e, 0x81, 0x77, 0x3c, 0xfe, 0x3a, 0x0a, 0x18,
	0xbe, 0x80, 0xee, 0xd1, 0x98, 0x8f, 0x86, 0x67, 0x53, 0xfe, 0x23, 0x70, 0xbe, 0x78, 0x5b, 0xcc,
	0x3e, 0x9d, 0xc0, 0x1d, 0xfc, 0x61, 0xf0, 0xf2, 0x58, 0x64, 0x74, 0xa6, 0x88, 0x4e, 0x49, 0xdd,
	0x8a, 0x84, 0x70, 0x0a, 0x7e, 0x63, 0x36, 0x70, 0xf7, 0xf1, 0xa9, 0xb1, 0xdf, 0xaf, 0xb7, 0xb3,
	0x71, 0xac, 0xa2, 0x16, 0x8e, 0xa1, 0xbb, 0x6a, 0x19, 0x77, 0x1e, 0xb3, 0xa2, 0x16, 0x7b, 0xbb,
	0xc1, 0xa9, 0xa8, 0xf5, 0xf9, 0x10, 0x76, 0x13, 0x79, 0x13, 0xa7, 0x52, 0xa6, 0x19, 0xc5, 0x73,
	0xba, 0xd5, 0x52, 0x66, 0x65, 0xf3, 0xcc, 0xcf, 0x57, 0x77, 0x7f, 0xcf, 0x2c, 0x95, 0x33, 0x8b,
	0x2e, 0x3a, 0xf6, 0xf5, 0xe1, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x61, 0x5d, 0xc6, 0xc7, 0x65,
	0x03, 0x00, 0x00,
}
