From 31e9cc7cbfa8978aa0147c8ffe9fe5fda8cf19d3 Mon Sep 17 00:00:00 2001 From: Goffi Date: Fri, 13 Mar 2020 17:46:27 +0100 Subject: [PATCH] core (tools/utils): new `asDeferred` function: asDeferred is similar to defer.maybeCoroutine, and also handles coroutine. --- sat/tools/utils.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/sat/tools/utils.py b/sat/tools/utils.py index 9a4d8592..48da76d2 100644 --- a/sat/tools/utils.py +++ b/sat/tools/utils.py @@ -29,7 +29,9 @@ import random import inspect import textwrap import functools -from twisted.python import procutils +from asyncio import iscoroutine +from twisted.python import procutils, failure +from twisted.internet import defer from sat.core.constants import Const as C from sat.core.log import getLogger @@ -90,6 +92,27 @@ def partial(func, *fixed_args, **fixed_kwargs): return method +def asDeferred(func, *args, **kwargs): + """Call a method and return a Deferred + + the method can be a simple callable, a Deferred or a coroutine. + It is similar to defer.maybeDeferred, but also handles coroutines + """ + try: + ret = func(*args, **kwargs) + except Exception as e: + return defer.fail(failure.Failure(e)) + else: + if iscoroutine(ret): + return defer.ensureDeferred(ret) + elif isinstance(ret, defer.Deferred): + return ret + elif isinstance(ret, failure.Failure): + return defer.fail(ret) + else: + return ret + + def xmpp_date(timestamp=None, with_time=True): """Return date according to XEP-0082 specification