aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/python/src/_framework/foundation/callable_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/src/_framework/foundation/callable_util.py')
-rw-r--r--src/python/src/_framework/foundation/callable_util.py39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/python/src/_framework/foundation/callable_util.py b/src/python/src/_framework/foundation/callable_util.py
index 1f7546cb76..32b0751a01 100644
--- a/src/python/src/_framework/foundation/callable_util.py
+++ b/src/python/src/_framework/foundation/callable_util.py
@@ -29,18 +29,47 @@
"""Utilities for working with callables."""
+import abc
+import collections
+import enum
import functools
import logging
-from _framework.foundation import future
+
+class Outcome(object):
+ """A sum type describing the outcome of some call.
+
+ Attributes:
+ kind: One of Kind.RETURNED or Kind.RAISED respectively indicating that the
+ call returned a value or raised an exception.
+ return_value: The value returned by the call. Must be present if kind is
+ Kind.RETURNED.
+ exception: The exception raised by the call. Must be present if kind is
+ Kind.RAISED.
+ """
+ __metaclass__ = abc.ABCMeta
+
+ @enum.unique
+ class Kind(enum.Enum):
+ """Identifies the general kind of the outcome of some call."""
+
+ RETURNED = object()
+ RAISED = object()
+
+
+class _EasyOutcome(
+ collections.namedtuple(
+ '_EasyOutcome', ['kind', 'return_value', 'exception']),
+ Outcome):
+ """A trivial implementation of Outcome."""
def _call_logging_exceptions(behavior, message, *args, **kwargs):
try:
- return future.returned(behavior(*args, **kwargs))
+ return _EasyOutcome(Outcome.Kind.RETURNED, behavior(*args, **kwargs), None)
except Exception as e: # pylint: disable=broad-except
logging.exception(message)
- return future.raised(e)
+ return _EasyOutcome(Outcome.Kind.RAISED, None, e)
def with_exceptions_logged(behavior, message):
@@ -72,7 +101,7 @@ def call_logging_exceptions(behavior, message, *args, **kwargs):
**kwargs: Keyword arguments to pass to the given behavior.
Returns:
- A future.Outcome describing whether the given behavior returned a value or
- raised an exception.
+ An Outcome describing whether the given behavior returned a value or raised
+ an exception.
"""
return _call_logging_exceptions(behavior, message, *args, **kwargs)