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

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

package internal

import (
	"v.io/v23/context"
	"v.io/v23/i18n"
	"v.io/v23/security"
	"v.io/v23/verror"
)

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

//////////////////////////////////////////////////
// Error definitions

var (
	ErrUnrecognizedRemoteBlessings = verror.Register("v.io/x/ref/services/iberoot/iberootd/internal.UnrecognizedRemoteBlessings", verror.NoRetry, "{1:}{2:} blessing provided by the remote end: {3} [rejected: {4}] are not recognized by this identity provider: {5}")
	ErrInternal                    = verror.Register("v.io/x/ref/services/iberoot/iberootd/internal.Internal", verror.NoRetry, "{1:}{2:} internal error: {3}")
)

// NewErrUnrecognizedRemoteBlessings returns an error with the ErrUnrecognizedRemoteBlessings ID.
func NewErrUnrecognizedRemoteBlessings(ctx *context.T, blessings []string, rejected []security.RejectedBlessing, name string) error {
	return verror.New(ErrUnrecognizedRemoteBlessings, ctx, blessings, rejected, name)
}

// NewErrInternal returns an error with the ErrInternal ID.
func NewErrInternal(ctx *context.T, err error) error {
	return verror.New(ErrInternal, ctx, err)
}

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

	// Set error format strings.
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrUnrecognizedRemoteBlessings.ID), "{1:}{2:} blessing provided by the remote end: {3} [rejected: {4}] are not recognized by this identity provider: {5}")
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrInternal.ID), "{1:}{2:} internal error: {3}")

	return struct{}{}
}
