/********************************************************************************
 *  Copyright 2020 Dell Inc.
 *
 * Licensed 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 mqtt

import (
	"fmt"
)

const (
	// Different Client operations.
	PublishOperation     = "Publish"
	SubscribeOperation   = "Subscribe"
	UnsubscribeOperation = "Unsubscribe"
	ConnectOperation     = "Connect"
)

// TimeoutErr defines an error representing operations which have not completed and surpassed the allowed wait time.
type TimeoutErr struct {
	operation string
	message   string
}

func (te TimeoutErr) Error() string {
	return fmt.Sprintf("Timeout occured while performing a '%s' operation: %s", te.operation, te.message)
}

// NewTimeoutError creates a new TimeoutErr.
func NewTimeoutError(operation string, message string) TimeoutErr {
	return TimeoutErr{
		operation: operation,
		message:   message,
	}
}

// OperationErr defines an error representing operations which have failed.
type OperationErr struct {
	operation string
	message   string
}

func (oe OperationErr) Error() string {
	return fmt.Sprintf("An error occured while performing a '%s' operation: %s", oe.operation, oe.message)
}

// NewOperationErr creates a new OperationErr
func NewOperationErr(operation string, message string) OperationErr {
	return OperationErr{
		operation: operation,
		message:   message,
	}
}
