// 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.
var vdl = require('../../../../vdl');
var canonicalize = require('../../../../vdl/canonicalize');





var time = require('./../vdlroot/time');
var security = require('./../security');
var vtrace = require('./../vtrace');

module.exports = {};



// Types:
var _typeRequest = new vdl.Type();
var _typeResponse = new vdl.Type();
_typeRequest.kind = vdl.kind.STRUCT;
_typeRequest.name = "v.io/v23/rpc.Request";
_typeRequest.fields = [{name: "Suffix", type: vdl.types.STRING}, {name: "Method", type: vdl.types.STRING}, {name: "NumPosArgs", type: vdl.types.UINT64}, {name: "EndStreamArgs", type: vdl.types.BOOL}, {name: "Deadline", type: new time.WireDeadline()._type}, {name: "GrantedBlessings", type: new security.WireBlessings()._type}, {name: "TraceRequest", type: new vtrace.Request()._type}, {name: "Language", type: vdl.types.STRING}];
_typeResponse.kind = vdl.kind.STRUCT;
_typeResponse.name = "v.io/v23/rpc.Response";
_typeResponse.fields = [{name: "Error", type: vdl.types.ERROR}, {name: "EndStreamResults", type: vdl.types.BOOL}, {name: "NumPosResults", type: vdl.types.UINT64}, {name: "TraceResponse", type: new vtrace.Response()._type}, {name: "AckBlessings", type: vdl.types.BOOL}];
_typeRequest.freeze();
_typeResponse.freeze();
module.exports.Request = (vdl.registry.lookupOrCreateConstructor(_typeRequest));
module.exports.Response = (vdl.registry.lookupOrCreateConstructor(_typeResponse));




// Consts:

  module.exports.GlobMethod = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__Glob", true), vdl.types.STRING);

  module.exports.ReservedSignature = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__Signature", true), vdl.types.STRING);

  module.exports.ReservedMethodSignature = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__MethodSignature", true), vdl.types.STRING);



// Errors:



// Services:

   
 


