ERR_INTERNAL = (1, "INTERNAL")

# IO errors
ERR_IO_INVALID_SUPERVISION_ENGINE = (101, "INVALID_IO_ENGINE")
ERR_IO_OPERATION_NOT_SUPPORTED_BY_DRIVER = (102, "OPERATION_NOT_SUPPORTED_BY_DRIVER")
ERR_IO_INVALID_PATH = (103, "INVALID_PATH")
ERR_IO_INVALID_IMAGE = (104, "INVALID_IMAGE")

# Matching errors
ERR_MATCHING_MATCH_COUNT_OUT_OF_BOUNDS = (201, "MATCH_COUNT_OUT_OF_BOUNDS")
ERR_MATCHING_INVALID_ENGINE_CONFIG = (202, "INVALID_ENGINE_CONFIG")

# Supervision errors
ERR_SUPERVISION_CORRESPONDENCE_NOT_FOUND = (301, "CORRESPONDENCE_NOT_FOUND")
ERR_SUPERVISION_INVALID_ENGINE_CONFIG = (302, "INVALID_ENGINE_CONFIG")

# Template errors
ERR_TEMPLATE_INVALID_SUPERVISION_ENGINE = (401, "INVALID_SUPERVISION_ENGINE")
ERR_TEMPLATE_INVALID_MATCHING_ENGINE = (402, "INVALID_MATCHING_ENGINE")
ERR_TEMPLATE_ID_NOT_UNIQUE = (403, "ID_NOT_UNIQUE")
ERR_TEMPLATE_INVALID_KEYPOINT = (404, "INVALID_KEYPOINT")
ERR_TEMPLATE_INVALID_FEATURE = (405, "INVALID_FEATURE")
ERR_TEMPLATE_INVALID_CONCURRENCY_CONFIG = (406, "INVALID_CONCURRENCY_CONFIG")
ERR_TEMPLATE_INVALID_SYNTAX = (407, "INVALID_SYNTAX")
ERR_TEMPLATE_INVALID_FEATURE_CLASS = (408, "INVALID_FEATURE_CLASS")
ERR_TEMPLATE_INVALID_MUTATOR = (409, "INVALID_MUTATOR")
ERR_TEMPLATE_INVALID_INTERPRETATION = (410, "INVALID_INTERPRETATION")

# TODO: search for all raise statements in the entire project, and ensure that every call specifies arguments in accordance with a certain convention
