// 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 makeError = require('../../../../../verror/make-errors');
var actions = require('../../../../../verror/actions');
var canonicalize = require('../../../../../vdl/canonicalize');





var security = require('./..');

module.exports = {};



// Types:
var _type1 = new vdl.Type();
var _type2 = new vdl.Type();
var _type3 = new vdl.Type();
var _typeAccessList = new vdl.Type();
var _typePermissions = new vdl.Type();
var _typeTag = new vdl.Type();
_type1.kind = vdl.kind.LIST;
_type1.name = "";
_type1.elem = new security.BlessingPattern()._type;
_type2.kind = vdl.kind.LIST;
_type2.name = "";
_type2.elem = vdl.types.STRING;
_type3.kind = vdl.kind.LIST;
_type3.name = "";
_type3.elem = new security.RejectedBlessing()._type;
_typeAccessList.kind = vdl.kind.STRUCT;
_typeAccessList.name = "v.io/v23/security/access.AccessList";
_typeAccessList.fields = [{name: "In", type: _type1}, {name: "NotIn", type: _type2}];
_typePermissions.kind = vdl.kind.MAP;
_typePermissions.name = "v.io/v23/security/access.Permissions";
_typePermissions.elem = _typeAccessList;
_typePermissions.key = vdl.types.STRING;
_typeTag.kind = vdl.kind.STRING;
_typeTag.name = "v.io/v23/security/access.Tag";
_type1.freeze();
_type2.freeze();
_type3.freeze();
_typeAccessList.freeze();
_typePermissions.freeze();
_typeTag.freeze();
module.exports.AccessList = (vdl.registry.lookupOrCreateConstructor(_typeAccessList));
module.exports.Permissions = (vdl.registry.lookupOrCreateConstructor(_typePermissions));
module.exports.Tag = (vdl.registry.lookupOrCreateConstructor(_typeTag));




// Consts:

  module.exports.Admin = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeTag))("Admin", true), _typeTag);

  module.exports.Debug = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeTag))("Debug", true), _typeTag);

  module.exports.Read = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeTag))("Read", true), _typeTag);

  module.exports.Write = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeTag))("Write", true), _typeTag);

  module.exports.Resolve = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeTag))("Resolve", true), _typeTag);



// Errors:

module.exports.TooBigError = makeError('v.io/v23/security/access.TooBig', actions.NO_RETRY, {
  'en': '{1:}{2:} AccessList is too big',
}, [
]);


module.exports.NoPermissionsError = makeError('v.io/v23/security/access.NoPermissions', actions.NO_RETRY, {
  'en': '{1:}{2:} {3} does not have {5} access (rejected blessings: {4})',
}, [
  _type2,
  _type3,
  vdl.types.STRING,
]);


module.exports.AccessListMatchError = makeError('v.io/v23/security/access.AccessListMatch', actions.NO_RETRY, {
  'en': '{1:}{2:} {3} does not match the access list (rejected blessings: {4})',
}, [
  _type2,
  _type3,
]);


module.exports.UnenforceablePatternsError = makeError('v.io/v23/security/access.UnenforceablePatterns', actions.NO_RETRY, {
  'en': '{1:}{2:} AccessList contains the following invalid or unrecognized patterns in the In list: {3}',
}, [
  _type1,
]);


module.exports.InvalidOpenAccessListError = makeError('v.io/v23/security/access.InvalidOpenAccessList', actions.NO_RETRY, {
  'en': '{1:}{2:} AccessList with the pattern ... in its In list must have no other patterns in the In or NotIn lists',
}, [
]);




// Services:

   
 


