/*
*
* Copyright 2019 NXP
* SPDX-License-Identifier: Apache-2.0
*/

/** @file
 *
 * @addtogroup param_check
 *
 * @{
 *
 * nxEnsure.h:  Helper parameter assertion check macros.
 *
 * Pre Condition: The source file must have included nxLog
 *                header file.
 *
 * Project:  SecureIoTMW
 *
 *
 */

#ifndef HOSTLIB_HOSTLIB_INC_NXENSURE_H_
#define HOSTLIB_HOSTLIB_INC_NXENSURE_H_

/* *****************************************************************************************************************
 *   Includes
 * ***************************************************************************************************************** */

/* *****************************************************************************************************************
 * MACROS/Defines
 * ***************************************************************************************************************** */

/** Build time over-ride if we want to enable/disable Warning Prints
 *
 * During debug builds, it makes sense to print them,
 * During retail builds, such loggings would be of any use and remove and reduce code size.
 *
 */
#ifndef NX_ENSURE_DO_LOG_MESSAGE
#define NX_ENSURE_DO_LOG_MESSAGE 1
#endif /* NX_ENSURE_DO_LOG_MESSAGE */

/**
 * @brief Waring print of the parameter ``strCONDITION``
 *
 * @warning NX_ENSURE_MESSAGE is an internal message/API to this file.
 *          Do not use directly.
 *
 */
#if NX_ENSURE_DO_LOG_MESSAGE
#   define NX_ENSURE_MESSAGE(strCONDITION)   \
        LOG_W("nxEnsure:'" strCONDITION "' failed. At Line:%d Function:%s", __LINE__, __FUNCTION__)
#else /* NX_ENSURE_DO_LOG_MESSAGE */
#   define NX_ENSURE_MESSAGE(strCONDITION)  /* No Message */
#endif /* NX_ENSURE_DO_LOG_MESSAGE */

/**
 * @brief Waring print of the parameter ``strCONDITION``
 *
 * @warning NX_ENSURE_MESSAGE is an internal message/API to this file.
 *          Do not use directly.
 *
 */
#if NX_ENSURE_DO_LOG_MESSAGE
#   define NX_ENSURE_MESSAGE(strCONDITION)   \
        LOG_W("nxEnsure:'" strCONDITION "' failed. At Line:%d Function:%s", __LINE__, __FUNCTION__)
#else /* NX_ENSURE_DO_LOG_MESSAGE */
#   define NX_ENSURE_MESSAGE(strCONDITION)  /* No Message */
#endif /* NX_ENSURE_DO_LOG_MESSAGE */

/** If condition fails, goto :cleanup label
 *
 * @code{.c}
 *
 *  {
 *      ...
 *
 *      status = Operation1();
 *      ENSURE_OR_GO_CLEANUP(0 == status);
 *
 *      status = Operation2();
 *      ENSURE_OR_GO_CLEANUP(0 == status);
 *
 *      ...
 *
 *  cleanup:
 *      return status;
 *  }
 *
 * @endcode
 *
 */
#define ENSURE_OR_GO_CLEANUP(CONDITION) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        goto cleanup; \
    }

/** If condition fails, goto :exit label
 *
 * @code{.c}
 *
 *  {
 *      ...
 *
 *      status = Operation1();
 *      ENSURE_OR_GO_EXIT(0 == status);
 *
 *      status = Operation2();
 *      ENSURE_OR_GO_EXIT(0 == status);
 *
 *      ...
 *
 *  exit:
 *      return status;
 *  }
 *
 * @endcode
 *
 */
#define ENSURE_OR_GO_EXIT(CONDITION) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        goto exit; \
    }

/** If condition fails, break.
 *
 * Sample Usage:
 *
 * @code{.c}
 *
 * int SomeAPI()
 * {
 *     ...
 *
 *     do {
 *         status = Operation1();
 *         ENSURE_OR_BREAK(0 == status);
 *
 *         status = Operation2();
 *         ENSURE_OR_BREAK(0 == status);
 *
 *         ...
 *
 *     } while(0);
 *
 *     return status;
 * }
 *
 * @endcode
 *
 */
#define ENSURE_OR_BREAK(CONDITION) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        break; \
    }

/** If condition fails, return
 *
 *
 * @code{.c}
 *
 *  void SomeAPI()
 *  {
 *      ...
 *
 *      status = Operation1();
 *      ENSURE_OR_RETURN(0 == status);
 *
 *      status = Operation2();
 *      ENSURE_OR_RETURN(0 == status);
 *
 *      ...
 *
 *      return;
 *  }
 *
 * @endcode
 *
 * @warning This macro introduces system of mutliple
 *          returns from a function which is not
 *          easy to debug/trace through and hence
 *          not recommended.
 *
 */
#define ENSURE_OR_RETURN(CONDITION) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        return; \
    }

/** If condition fails, return
 *
 *
 * @code{.c}
 *
 *  int SomeAPI()
 *  {
 *      ...
 *
 *      status = Operation1();
 *      ENSURE_OR_RETURN_ON_ERROR(0 == status, ERR_FAIL);
 *
 *      status = Operation2();
 *      ENSURE_OR_RETURN_ON_ERROR(0 == status, ERR_NOT_ENOUGH_SPACE);
 *
 *      ...
 *
 *      return 0;
 *  }
 *
 * @endcode
 *
 * @warning This macro introduces system of mutliple
 *          returns from a function which is not
 *          easy to debug/trace through and hence
 *          not recommended.
 *
 */
#define ENSURE_OR_RETURN_ON_ERROR(CONDITION, RETURN_VALUE) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        return RETURN_VALUE; \
    }

/** If condition fails, goto quit with return value status updated.
 *
 *
 * @code{.c}
 *
 *  int SomeAPI()
 *  {
        int status = 0;
 *      ...
 *
 *      value = Operation1();
 *      ENSURE_OR_QUIT_WITH_STATUS_ON_ERROR(0 == value, status, ERR_FAIL);
 *
 *      value = Operation2();
 *      ENSURE_OR_QUIT_WITH_STATUS_ON_ERROR(0 == value, status, ERR_NOT_ENOUGH_SPACE);
 *
 *      ...
 *  quit:
 *      return status;
 *  }
 *
 * @endcode
 *
 * @warning This macro introduces system of mutliple
 *          returns from a function which is not
 *          easy to debug/trace through and hence
 *          not recommended.
 *
 */
#define ENSURE_OR_EXIT_WITH_STATUS_ON_ERROR(CONDITION, STATUS, RETURN_VALUE) \
    if (!(CONDITION)) { \
        NX_ENSURE_MESSAGE(#CONDITION); \
        STATUS = RETURN_VALUE; \
        goto exit; \
    }

/* *****************************************************************************************************************
 * Types/Structure Declarations
 * ***************************************************************************************************************** */

/* *****************************************************************************************************************
 *   Extern Variables
 * ***************************************************************************************************************** */

/* *****************************************************************************************************************
 *   Function Prototypes
 * ***************************************************************************************************************** */

/** @} */

#endif /* HOSTLIB_HOSTLIB_INC_NXENSURE_H_ */
