|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | 3 | import typing |
| 4 | +from collections.abc import Mapping |
4 | 5 | from enum import Enum |
5 | 6 |
|
6 | 7 |
|
7 | | -class ErrorCode(Enum): |
8 | | - PROVIDER_NOT_READY = "PROVIDER_NOT_READY" |
9 | | - PROVIDER_FATAL = "PROVIDER_FATAL" |
10 | | - FLAG_NOT_FOUND = "FLAG_NOT_FOUND" |
11 | | - PARSE_ERROR = "PARSE_ERROR" |
12 | | - TYPE_MISMATCH = "TYPE_MISMATCH" |
13 | | - TARGETING_KEY_MISSING = "TARGETING_KEY_MISSING" |
14 | | - INVALID_CONTEXT = "INVALID_CONTEXT" |
15 | | - GENERAL = "GENERAL" |
16 | | - |
17 | | - @classmethod |
18 | | - def to_exception( |
19 | | - cls, error_code: ErrorCode, error_message: str |
20 | | - ) -> OpenFeatureError: |
21 | | - return typing.cast( |
22 | | - OpenFeatureError, |
23 | | - { |
24 | | - ErrorCode.PROVIDER_NOT_READY: ProviderNotReadyError, |
25 | | - ErrorCode.PROVIDER_FATAL: ProviderFatalError, |
26 | | - ErrorCode.FLAG_NOT_FOUND: FlagNotFoundError, |
27 | | - ErrorCode.PARSE_ERROR: ParseError, |
28 | | - ErrorCode.TYPE_MISMATCH: TypeMismatchError, |
29 | | - ErrorCode.TARGETING_KEY_MISSING: TargetingKeyMissingError, |
30 | | - ErrorCode.INVALID_CONTEXT: InvalidContextError, |
31 | | - ErrorCode.GENERAL: GeneralError, |
32 | | - }.get(error_code, GeneralError)(error_message), |
33 | | - ) |
34 | | - |
35 | | - |
36 | 8 | class OpenFeatureError(Exception): |
37 | 9 | """ |
38 | 10 | A generic open feature exception, this exception should not be raised. Instead |
@@ -176,3 +148,32 @@ def __init__(self, error_message: typing.Optional[str]): |
176 | 148 | raised |
177 | 149 | """ |
178 | 150 | super().__init__(ErrorCode.INVALID_CONTEXT, error_message) |
| 151 | + |
| 152 | + |
| 153 | +class ErrorCode(Enum): |
| 154 | + PROVIDER_NOT_READY = "PROVIDER_NOT_READY" |
| 155 | + PROVIDER_FATAL = "PROVIDER_FATAL" |
| 156 | + FLAG_NOT_FOUND = "FLAG_NOT_FOUND" |
| 157 | + PARSE_ERROR = "PARSE_ERROR" |
| 158 | + TYPE_MISMATCH = "TYPE_MISMATCH" |
| 159 | + TARGETING_KEY_MISSING = "TARGETING_KEY_MISSING" |
| 160 | + INVALID_CONTEXT = "INVALID_CONTEXT" |
| 161 | + GENERAL = "GENERAL" |
| 162 | + |
| 163 | + __exceptions__: Mapping[str, typing.Callable[[str], OpenFeatureError]] = { |
| 164 | + PROVIDER_NOT_READY: ProviderNotReadyError, |
| 165 | + PROVIDER_FATAL: ProviderFatalError, |
| 166 | + FLAG_NOT_FOUND: FlagNotFoundError, |
| 167 | + PARSE_ERROR: ParseError, |
| 168 | + TYPE_MISMATCH: TypeMismatchError, |
| 169 | + TARGETING_KEY_MISSING: TargetingKeyMissingError, |
| 170 | + INVALID_CONTEXT: InvalidContextError, |
| 171 | + GENERAL: GeneralError, |
| 172 | + } |
| 173 | + |
| 174 | + @classmethod |
| 175 | + def to_exception( |
| 176 | + cls, error_code: ErrorCode, error_message: str |
| 177 | + ) -> OpenFeatureError: |
| 178 | + exc = cls.__exceptions__.get(error_code.value, GeneralError) |
| 179 | + return exc(error_message) |
0 commit comments