// Copyright 2015 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.

// This file was auto-generated by the vanadium vdl tool.
// Package: vtrace

// Package vtrace defines an interface to access v.io/v23/vtrace traces, to help
// analyze and debug distributed systems.
package vtrace

import (
	"io"
	"v.io/v23"
	"v.io/v23/context"
	"v.io/v23/rpc"
	"v.io/v23/security/access"
	"v.io/v23/uniqueid"
	"v.io/v23/vdl"
	"v.io/v23/vtrace"
)

var _ = __VDLInit() // Must be first; see __VDLInit comments for details.

//////////////////////////////////////////////////
// Interface definitions

// StoreClientMethods is the client interface
// containing Store methods.
type StoreClientMethods interface {
	// Trace returns the trace that matches the given Id.
	// Will return a NoExists error if no matching trace was found.
	Trace(_ *context.T, id uniqueid.Id, _ ...rpc.CallOpt) (vtrace.TraceRecord, error)
	// AllTraces returns TraceRecords for all traces the server currently
	// knows about.
	AllTraces(*context.T, ...rpc.CallOpt) (StoreAllTracesClientCall, error)
}

// StoreClientStub adds universal methods to StoreClientMethods.
type StoreClientStub interface {
	StoreClientMethods
	rpc.UniversalServiceMethods
}

// StoreClient returns a client stub for Store.
func StoreClient(name string) StoreClientStub {
	return implStoreClientStub{name}
}

type implStoreClientStub struct {
	name string
}

func (c implStoreClientStub) Trace(ctx *context.T, i0 uniqueid.Id, opts ...rpc.CallOpt) (o0 vtrace.TraceRecord, err error) {
	err = v23.GetClient(ctx).Call(ctx, c.name, "Trace", []interface{}{i0}, []interface{}{&o0}, opts...)
	return
}

func (c implStoreClientStub) AllTraces(ctx *context.T, opts ...rpc.CallOpt) (ocall StoreAllTracesClientCall, err error) {
	var call rpc.ClientCall
	if call, err = v23.GetClient(ctx).StartCall(ctx, c.name, "AllTraces", nil, opts...); err != nil {
		return
	}
	ocall = &implStoreAllTracesClientCall{ClientCall: call}
	return
}

// StoreAllTracesClientStream is the client stream for Store.AllTraces.
type StoreAllTracesClientStream interface {
	// RecvStream returns the receiver side of the Store.AllTraces client stream.
	RecvStream() interface {
		// Advance stages an item so that it may be retrieved via Value.  Returns
		// true iff there is an item to retrieve.  Advance must be called before
		// Value is called.  May block if an item is not available.
		Advance() bool
		// Value returns the item that was staged by Advance.  May panic if Advance
		// returned false or was not called.  Never blocks.
		Value() vtrace.TraceRecord
		// Err returns any error encountered by Advance.  Never blocks.
		Err() error
	}
}

// StoreAllTracesClientCall represents the call returned from Store.AllTraces.
type StoreAllTracesClientCall interface {
	StoreAllTracesClientStream
	// Finish blocks until the server is done, and returns the positional return
	// values for call.
	//
	// Finish returns immediately if the call has been canceled; depending on the
	// timing the output could either be an error signaling cancelation, or the
	// valid positional return values from the server.
	//
	// Calling Finish is mandatory for releasing stream resources, unless the call
	// has been canceled or any of the other methods return an error.  Finish should
	// be called at most once.
	Finish() error
}

type implStoreAllTracesClientCall struct {
	rpc.ClientCall
	valRecv vtrace.TraceRecord
	errRecv error
}

func (c *implStoreAllTracesClientCall) RecvStream() interface {
	Advance() bool
	Value() vtrace.TraceRecord
	Err() error
} {
	return implStoreAllTracesClientCallRecv{c}
}

type implStoreAllTracesClientCallRecv struct {
	c *implStoreAllTracesClientCall
}

func (c implStoreAllTracesClientCallRecv) Advance() bool {
	c.c.valRecv = vtrace.TraceRecord{}
	c.c.errRecv = c.c.Recv(&c.c.valRecv)
	return c.c.errRecv == nil
}
func (c implStoreAllTracesClientCallRecv) Value() vtrace.TraceRecord {
	return c.c.valRecv
}
func (c implStoreAllTracesClientCallRecv) Err() error {
	if c.c.errRecv == io.EOF {
		return nil
	}
	return c.c.errRecv
}
func (c *implStoreAllTracesClientCall) Finish() (err error) {
	err = c.ClientCall.Finish()
	return
}

// StoreServerMethods is the interface a server writer
// implements for Store.
type StoreServerMethods interface {
	// Trace returns the trace that matches the given Id.
	// Will return a NoExists error if no matching trace was found.
	Trace(_ *context.T, _ rpc.ServerCall, id uniqueid.Id) (vtrace.TraceRecord, error)
	// AllTraces returns TraceRecords for all traces the server currently
	// knows about.
	AllTraces(*context.T, StoreAllTracesServerCall) error
}

// StoreServerStubMethods is the server interface containing
// Store methods, as expected by rpc.Server.
// The only difference between this interface and StoreServerMethods
// is the streaming methods.
type StoreServerStubMethods interface {
	// Trace returns the trace that matches the given Id.
	// Will return a NoExists error if no matching trace was found.
	Trace(_ *context.T, _ rpc.ServerCall, id uniqueid.Id) (vtrace.TraceRecord, error)
	// AllTraces returns TraceRecords for all traces the server currently
	// knows about.
	AllTraces(*context.T, *StoreAllTracesServerCallStub) error
}

// StoreServerStub adds universal methods to StoreServerStubMethods.
type StoreServerStub interface {
	StoreServerStubMethods
	// Describe the Store interfaces.
	Describe__() []rpc.InterfaceDesc
}

// StoreServer returns a server stub for Store.
// It converts an implementation of StoreServerMethods into
// an object that may be used by rpc.Server.
func StoreServer(impl StoreServerMethods) StoreServerStub {
	stub := implStoreServerStub{
		impl: impl,
	}
	// Initialize GlobState; always check the stub itself first, to handle the
	// case where the user has the Glob method defined in their VDL source.
	if gs := rpc.NewGlobState(stub); gs != nil {
		stub.gs = gs
	} else if gs := rpc.NewGlobState(impl); gs != nil {
		stub.gs = gs
	}
	return stub
}

type implStoreServerStub struct {
	impl StoreServerMethods
	gs   *rpc.GlobState
}

func (s implStoreServerStub) Trace(ctx *context.T, call rpc.ServerCall, i0 uniqueid.Id) (vtrace.TraceRecord, error) {
	return s.impl.Trace(ctx, call, i0)
}

func (s implStoreServerStub) AllTraces(ctx *context.T, call *StoreAllTracesServerCallStub) error {
	return s.impl.AllTraces(ctx, call)
}

func (s implStoreServerStub) Globber() *rpc.GlobState {
	return s.gs
}

func (s implStoreServerStub) Describe__() []rpc.InterfaceDesc {
	return []rpc.InterfaceDesc{StoreDesc}
}

// StoreDesc describes the Store interface.
var StoreDesc rpc.InterfaceDesc = descStore

// descStore hides the desc to keep godoc clean.
var descStore = rpc.InterfaceDesc{
	Name:    "Store",
	PkgPath: "v.io/v23/services/vtrace",
	Methods: []rpc.MethodDesc{
		{
			Name: "Trace",
			Doc:  "// Trace returns the trace that matches the given Id.\n// Will return a NoExists error if no matching trace was found.",
			InArgs: []rpc.ArgDesc{
				{"id", ``}, // uniqueid.Id
			},
			OutArgs: []rpc.ArgDesc{
				{"", ``}, // vtrace.TraceRecord
			},
			Tags: []*vdl.Value{vdl.ValueOf(access.Tag("Debug"))},
		},
		{
			Name: "AllTraces",
			Doc:  "// AllTraces returns TraceRecords for all traces the server currently\n// knows about.",
			Tags: []*vdl.Value{vdl.ValueOf(access.Tag("Debug"))},
		},
	},
}

// StoreAllTracesServerStream is the server stream for Store.AllTraces.
type StoreAllTracesServerStream interface {
	// SendStream returns the send side of the Store.AllTraces server stream.
	SendStream() interface {
		// Send places the item onto the output stream.  Returns errors encountered
		// while sending.  Blocks if there is no buffer space; will unblock when
		// buffer space is available.
		Send(item vtrace.TraceRecord) error
	}
}

// StoreAllTracesServerCall represents the context passed to Store.AllTraces.
type StoreAllTracesServerCall interface {
	rpc.ServerCall
	StoreAllTracesServerStream
}

// StoreAllTracesServerCallStub is a wrapper that converts rpc.StreamServerCall into
// a typesafe stub that implements StoreAllTracesServerCall.
type StoreAllTracesServerCallStub struct {
	rpc.StreamServerCall
}

// Init initializes StoreAllTracesServerCallStub from rpc.StreamServerCall.
func (s *StoreAllTracesServerCallStub) Init(call rpc.StreamServerCall) {
	s.StreamServerCall = call
}

// SendStream returns the send side of the Store.AllTraces server stream.
func (s *StoreAllTracesServerCallStub) SendStream() interface {
	Send(item vtrace.TraceRecord) error
} {
	return implStoreAllTracesServerCallSend{s}
}

type implStoreAllTracesServerCallSend struct {
	s *StoreAllTracesServerCallStub
}

func (s implStoreAllTracesServerCallSend) Send(item vtrace.TraceRecord) error {
	return s.s.Send(item)
}

var __VDLInitCalled bool

// __VDLInit performs vdl initialization.  It is safe to call multiple times.
// If you have an init ordering issue, just insert the following line verbatim
// into your source files in this package, right after the "package foo" clause:
//
//    var _ = __VDLInit()
//
// The purpose of this function is to ensure that vdl initialization occurs in
// the right order, and very early in the init sequence.  In particular, vdl
// registration and package variable initialization needs to occur before
// functions like vdl.TypeOf will work properly.
//
// This function returns a dummy value, so that it can be used to initialize the
// first var in the file, to take advantage of Go's defined init order.
func __VDLInit() struct{} {
	if __VDLInitCalled {
		return struct{}{}
	}
	__VDLInitCalled = true

	return struct{}{}
}
