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

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))
	}
}
