// 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.
// Source: errors.vdl

package conn

import (
	// VDL system imports
	"v.io/v23/context"
	"v.io/v23/i18n"
	"v.io/v23/verror"
)

var (
	ErrInvalidMsg        = verror.Register("v.io/x/ref/runtime/internal/flow/conn.InvalidMsg", verror.NoRetry, "{1:}{2:} message of type{:3} and size{:4} failed decoding at field{:5}.")
	ErrInvalidControlMsg = verror.Register("v.io/x/ref/runtime/internal/flow/conn.InvalidControlMsg", verror.NoRetry, "{1:}{2:} control message of cmd{:3} and size{:4} failed decoding at field{:5}.")
	ErrUnknownMsg        = verror.Register("v.io/x/ref/runtime/internal/flow/conn.UnknownMsg", verror.NoRetry, "{1:}{2:} unknown message type{:3}.")
	ErrUnknownControlMsg = verror.Register("v.io/x/ref/runtime/internal/flow/conn.UnknownControlMsg", verror.NoRetry, "{1:}{2:} unknown control command{:3}.")
)

func init() {
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrInvalidMsg.ID), "{1:}{2:} message of type{:3} and size{:4} failed decoding at field{:5}.")
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrInvalidControlMsg.ID), "{1:}{2:} control message of cmd{:3} and size{:4} failed decoding at field{:5}.")
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrUnknownMsg.ID), "{1:}{2:} unknown message type{:3}.")
	i18n.Cat().SetWithBase(i18n.LangID("en"), i18n.MsgID(ErrUnknownControlMsg.ID), "{1:}{2:} unknown control command{:3}.")
}

// NewErrInvalidMsg returns an error with the ErrInvalidMsg ID.
func NewErrInvalidMsg(ctx *context.T, typ byte, size int64, field int64) error {
	return verror.New(ErrInvalidMsg, ctx, typ, size, field)
}

// NewErrInvalidControlMsg returns an error with the ErrInvalidControlMsg ID.
func NewErrInvalidControlMsg(ctx *context.T, cmd byte, size int64, field int64) error {
	return verror.New(ErrInvalidControlMsg, ctx, cmd, size, field)
}

// NewErrUnknownMsg returns an error with the ErrUnknownMsg ID.
func NewErrUnknownMsg(ctx *context.T, typ byte) error {
	return verror.New(ErrUnknownMsg, ctx, typ)
}

// NewErrUnknownControlMsg returns an error with the ErrUnknownControlMsg ID.
func NewErrUnknownControlMsg(ctx *context.T, cmd byte) error {
	return verror.New(ErrUnknownControlMsg, ctx, cmd)
}
