Skip to content

Introducing ErrorCode #253

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 8 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions api/ErrorCodes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#pragma once
#include <stdint.h>

namespace arduino {

typedef int_fast32_t error_t;

enum : error_t {
ArduinoSuccess = 0,
ArduinoError = 1,

// TODO better names
ArduinoEPERM = -1, /**< Not owner */
ArduinoENOENT = -2, /**< No such file or directory */
ArduinoESRCH = -3, /**< No such context */
ArduinoEINTR = -4, /**< Interrupted system call */
ArduinoEIO = -5, /**< I/O error */
ArduinoENXIO = -6, /**< No such device or address */
ArduinoE2BIG = -7, /**< Arg list too long */
ArduinoENOEXEC = -8, /**< Exec format error */
ArduinoEBADF = -9, /**< Bad file number */
ArduinoECHILD = -10, /**< No children */
ArduinoEAGAIN = -11, /**< No more contexts */
ArduinoENOMEM = -12, /**< Not enough core */
ArduinoEACCES = -13, /**< Permission denied */
ArduinoEFAULT = -14, /**< Bad address */
ArduinoENOTBLK = -15, /**< Block device required */
ArduinoEBUSY = -16, /**< Mount device busy */
ArduinoEEXIST = -17, /**< File exists */
ArduinoEXDEV = -18, /**< Cross-device link */
ArduinoENODEV = -19, /**< No such device */
ArduinoENOTDIR = -20, /**< Not a directory */
ArduinoEISDIR = -21, /**< Is a directory */
ArduinoEINVAL = -22, /**< Invalid argument */
ArduinoENFILE = -23, /**< File table overflow */
ArduinoEMFILE = -24, /**< Too many open files */
ArduinoENOTTY = -25, /**< Not a typewriter */
ArduinoETXTBSY = -26, /**< Text file busy */
ArduinoEFBIG = -27, /**< File too large */
ArduinoENOSPC = -28, /**< No space left on device */
ArduinoESPIPE = -29, /**< Illegal seek */
ArduinoEROFS = -30, /**< Read-only file system */
ArduinoEMLINK = -31, /**< Too many links */
ArduinoEPIPE = -32, /**< Broken pipe */
ArduinoENOMSG = -35, /**< Unexpected message type */
ArduinoEDEADLK = -45, /**< Resource deadlock avoided */
ArduinoENOLCK = -46, /**< No locks available */
ArduinoENOSTR = -60, /**< STREAMS device required */
ArduinoENODATA = -61, /**< Missing expected message data */
ArduinoETIME = -62, /**< STREAMS timeout occurred */
ArduinoENOSR = -63, /**< Insufficient memory */
ArduinoEPROTO = -71, /**< Generic STREAMS error */
ArduinoEBADMSG = -77, /**< Invalid STREAMS message */
ArduinoENOSYS = -88, /**< Function not implemented */
ArduinoENOTEMPTY = -90, /**< Directory not empty */
ArduinoENAMETOOLONG = -91, /**< File name too long */
ArduinoELOOP = -92, /**< Too many levels of symbolic links */
ArduinoEOPNOTSUPP = -95, /**< Operation not supported on socket */
ArduinoEPFNOSUPPORT = -96, /**< Protocol family not supported */
ArduinoECONNRESET = -104, /**< Connection reset by peer */
ArduinoENOBUFS = -105, /**< No buffer space available */
ArduinoEAFNOSUPPORT = -106, /**< Addr family not supported */
ArduinoEPROTOTYPE = -107, /**< Protocol wrong type for socket */
ArduinoENOTSOCK = -108, /**< Socket operation on non-socket */
ArduinoENOPROTOOPT = -109, /**< Protocol not available */
ArduinoESHUTDOWN = -110, /**< Can't send after socket shutdown */
ArduinoECONNREFUSED = -111, /**< Connection refused */
ArduinoEADDRINUSE = -112, /**< Address already in use */
ArduinoECONNABORTED = -113, /**< Software caused connection abort */
ArduinoENETUNREACH = -114, /**< Network is unreachable */
ArduinoENETDOWN = -115, /**< Network is down */
ArduinoETIMEDOUT = -116, /**< Connection timed out */
ArduinoEHOSTDOWN = -117, /**< Host is down */
ArduinoEHOSTUNREACH = -118, /**< No route to host */
ArduinoEINPROGRESS = -119, /**< Operation now in progress */
ArduinoEALREADY = -120, /**< Operation already in progress */
ArduinoEDESTADDRREQ = -121, /**< Destination address required */
ArduinoEMSGSIZE = -122, /**< Message size */
ArduinoEPROTONOSUPPORT = -123, /**< Protocol not supported */
ArduinoESOCKTNOSUPPORT = -124, /**< Socket type not supported */
ArduinoEADDRNOTAVAIL = -125, /**< Can't assign requested address */
ArduinoENETRESET = -126, /**< Network dropped connection on reset */
ArduinoEISCONN = -127, /**< Socket is already connected */
ArduinoENOTCONN = -128, /**< Socket is not connected */
ArduinoETOOMANYREFS = -129, /**< Too many references: can't splice */
ArduinoENOTSUP = -134, /**< Unsupported value */
ArduinoEOVERFLOW = -139, /**< Value overflow */
ArduinoECANCELED = -140, /**< Operation canceled */
ArduinoEWOULDBLOCK = ArduinoEAGAIN, /**< Operation would block */
};

/* Error Codes:
* In Arduino if a function returns 1 is considered to have run successfully,
* any value different from 1 is considered an error.
* Errors are generally represented with an int type that may vary in size depending on the platform.
* For this reason in this representation error_t type is defined with an integer type with a defined size.
*/
class ErrorCode {
public:
constexpr ErrorCode(int value): error(value == 1? ArduinoSuccess : ArduinoError) {}
constexpr ErrorCode(error_t value): error(value) {}
const error_t error;

constexpr operator bool() const {
return error == ArduinoSuccess;
}
};

/* ReturnValueClass is meant to represent all the cases where with a single value
* we want to return an error, if the value is negative, or a meaningful result
* if greater than or equal to 0.
* In order to be retrocompatible with the previous definition boolean evaluation:
* - It must return true, if the value is greater than or equal 0
* - It must return false, if the value is negatie
* - It must be evaluable as the primitive type associated with
*/
template<typename T>
class ReturnValueClass {
public:
constexpr ReturnValueClass(T value)
: value(value >= 0? value : 0), error(value < 0? value : ArduinoSuccess) {}

// it would be nice to have a default value on error to Success
constexpr ReturnValueClass(T value, error_t error)
: value(value), error(error) {}

const T value;
const error_t error;

constexpr operator bool() const {
return error == ArduinoSuccess;
}

constexpr operator T() const {
return value;
}
};

using ReturnValue = ReturnValueClass<int>;
using ReturnBoolValue = ReturnValueClass<bool>;
using ReturnLongValue = ReturnValueClass<int64_t>;

}
20 changes: 19 additions & 1 deletion test/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
build
build
### CMake ###
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps

### CMake Patch ###
CMakeUserPresets.json

# External projects
*-prefix/
15 changes: 13 additions & 2 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,20 @@ cmake_minimum_required(VERSION 2.8)

project(test-ArduinoCore-API)

Include(FetchContent)

FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.4.0
)

FetchContent_MakeAvailable(Catch2)

##########################################################################

include_directories(..)
include_directories(include)
include_directories(external/catch/v2.13.9/include)

##########################################################################

Expand Down Expand Up @@ -40,6 +49,7 @@ set(TEST_SRCS
src/Common/test_map.cpp
src/Common/test_max.cpp
src/Common/test_min.cpp
src/ErrorCodes/test_ErrorCodes.cpp
src/IPAddress/test_toString.cpp
src/IPAddress/test_fromString.cpp
src/IPAddress/test_fromString6.cpp
Expand Down Expand Up @@ -118,7 +128,6 @@ set(TEST_DUT_SRCS
##########################################################################

set(TEST_TARGET_SRCS
src/main.cpp
src/dtostrf.cpp
src/itoa.cpp
src/MillisFake.cpp
Expand All @@ -144,5 +153,7 @@ add_executable(
${TEST_TARGET_SRCS}
)

target_link_libraries( ${TEST_TARGET} Catch2WithMain )

##########################################################################

Loading
Loading