/*
 * 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 rocketmq

/*
#include <rocketmq/CCommon.h>
*/
import "C"
import "fmt"

type rmqError int

//This is error messages
const (
	NIL                        = rmqError(C.OK)
	ErrNullPoint               = rmqError(C.NULL_POINTER)
	ErrMallocFailed            = rmqError(C.MALLOC_FAILED)
	ErrProducerStartFailed     = rmqError(C.PRODUCER_START_FAILED)
	ErrSendSyncFailed          = rmqError(C.PRODUCER_SEND_SYNC_FAILED)
	ErrSendOnewayFailed        = rmqError(C.PRODUCER_SEND_ONEWAY_FAILED)
	ErrSendOrderlyFailed       = rmqError(C.PRODUCER_SEND_ORDERLY_FAILED)
	ErrPushConsumerStartFailed = rmqError(C.PUSHCONSUMER_ERROR_CODE_START)
	ErrPullConsumerStartFailed = rmqError(C.PULLCONSUMER_START_FAILED)
	ErrFetchMQFailed           = rmqError(C.PULLCONSUMER_FETCH_MQ_FAILED)
	ErrFetchMessageFailed      = rmqError(C.PULLCONSUMER_FETCH_MESSAGE_FAILED)
)

func (e rmqError) Error() string {
	switch e {
	case ErrNullPoint:
		return "null point"
	case ErrMallocFailed:
		return "malloc memory failed"
	case ErrProducerStartFailed:
		return "start producer failed"
	case ErrSendSyncFailed:
		return "send message with sync failed"
	case ErrSendOrderlyFailed:
		return "send message with orderly failed"
	case ErrSendOnewayFailed:
		return "send message with oneway failed"
	case ErrPushConsumerStartFailed:
		return "start push-consumer failed"
	case ErrPullConsumerStartFailed:
		return "start pull-consumer failed"
	case ErrFetchMQFailed:
		return "fetch MessageQueue failed"
	case ErrFetchMessageFailed:
		return "fetch Message failed"
	default:
		return fmt.Sprintf("unknow error: %v", int(e))
	}
}
