packages feed

eventlog-socket-0.1.1.0: cbits/eventlog_socket/error.h

#ifndef EVENTLOG_SOCKET_ERR_H
#define EVENTLOG_SOCKET_ERR_H

#include "./debug.h"

/// @brief Construct a status from an `EventlogSocketStatusCode` status code.
#define STATUS_FROM_CODE(status_code)                                          \
  ((EventlogSocketStatus){.ess_status_code = (status_code),                    \
                          .ess_error_code = 0})

/// @brief Construct a status from `errno`.
#define STATUS_FROM_ERRNO()                                                    \
  ((EventlogSocketStatus){.ess_status_code = EVENTLOG_SOCKET_ERR_SYS,          \
                          .ess_error_code = errno})

/// @brief Construct a status from a `pthread.h` error code.
#define STATUS_FROM_PTHREAD_ERROR(pthread_errno)                               \
  ((EventlogSocketStatus){.ess_status_code = EVENTLOG_SOCKET_ERR_SYS,          \
                          .ess_error_code = (pthread_errno)})

/// @brief Construct a status from a `getaddrinfo` error code.
#define STATUS_FROM_GAI_ERROR(gai_error)                                       \
  ((EventlogSocketStatus){.ess_status_code = EVENTLOG_SOCKET_ERR_GAI,          \
                          .ess_error_code = (gai_error)})

/// @brief If the @p expr returns an error status, immediately return it.
#define RETURN_ON_ERROR(expr)                                                  \
  do {                                                                         \
    const EventlogSocketStatus status = (expr);                                \
    if (status.ess_status_code != EVENTLOG_SOCKET_OK) {                        \
      char *strerr = eventlog_socket_strerror(status);                         \
      DEBUG_ERROR("%s", strerr);                                               \
      return status;                                                           \
    }                                                                          \
  } while (0)

#endif /* EVENTLOG_SOCKET_ERR_H */