/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package protocol

import "errors"

var (
	//ErrNilResult is of type error
	ErrNilResult = errors.New("result is nil")
	//ErrUnknown is of type string which returns unknown error
	ErrUnknown = ProxyError{"Unknown Error,instance is not selected, error is nil"}
	//ErrUnExpectedHandlerChainResponse is of type string which returns unexpected handler error
	ErrUnExpectedHandlerChainResponse = ProxyError{"Response from Handler chain is nil,better to check if handler chain is empty, or some handler just return a nil response"}
)

//ProxyError is a struct
type ProxyError struct {
	Message string
}

func (e ProxyError) Error() string {
	return e.Message
}
