package modules

type (
	preparationError struct {
		err error
	}

	frostFSInitError struct {
		err error
	}

	businessLogicError struct {
		err error
	}

	frostFSIDInitError struct {
		err error
	}

	policyInitError struct {
		err error
	}
)

func wrapPreparationError(e error) error {
	return preparationError{e}
}

func (e preparationError) Error() string {
	return e.err.Error()
}

func wrapFrostFSInitError(e error) error {
	return frostFSInitError{e}
}

func (e frostFSInitError) Error() string {
	return e.err.Error()
}

func wrapBusinessLogicError(e error) error {
	return businessLogicError{e}
}

func (e businessLogicError) Error() string {
	return e.err.Error()
}

func wrapFrostFSIDInitError(e error) error {
	return frostFSIDInitError{e}
}

func (e frostFSIDInitError) Error() string {
	return e.err.Error()
}

func wrapPolicyInitError(e error) error {
	return policyInitError{e}
}

func (e policyInitError) Error() string {
	return e.err.Error()
}

// ExitCode picks corresponding error code depending on the type of error provided.
// Returns 1 if error type is unknown.
func ExitCode(e error) int {
	switch e.(type) {
	case preparationError:
		return 2
	case frostFSInitError:
		return 3
	case businessLogicError:
		return 4
	case frostFSIDInitError:
		return 4
	case policyInitError:
		return 5
	}
	return 1
}