diff options
Diffstat (limited to 'ouroboros/_qosspec.py')
| -rw-r--r-- | ouroboros/_qosspec.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/ouroboros/_qosspec.py b/ouroboros/_qosspec.py new file mode 100644 index 0000000..5c8b245 --- /dev/null +++ b/ouroboros/_qosspec.py @@ -0,0 +1,61 @@ +# +# SPDX-FileCopyrightText: 2016 - 2026 Dimitri Staessens +# SPDX-License-Identifier: LGPL-2.1-only +# + +""" +Shared QoSSpec <-> qosspec_t conversion helpers. + +CFFI types are not interchangeable across extension modules, so the +caller passes its own ``ffi`` instance. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +from ouroboros.qos import QoSSpec + +if TYPE_CHECKING: + from cffi import FFI + + +def qos_to_qosspec(ffi: FFI, qos: Optional[QoSSpec]) -> Any: + """ + Convert a :class:`QoSSpec` to a freshly-allocated ``qosspec_t *``. + + Returns ``ffi.NULL`` when *qos* is ``None``. + """ + + if qos is None: + return ffi.NULL + + return ffi.new("qosspec_t *", + [qos.service, + qos.delay, + qos.bandwidth, + qos.availability, + qos.loss, + qos.ber, + qos.max_gap, + qos.timeout]) + + +def qosspec_to_qos(ffi: FFI, _qos: Any) -> Optional[QoSSpec]: + """ + Convert a ``qosspec_t *`` back to a :class:`QoSSpec`. + + Returns ``None`` when *_qos* is ``ffi.NULL``. + """ + + if _qos == ffi.NULL: + return None + + return QoSSpec(service=_qos.service, + delay=_qos.delay, + bandwidth=_qos.bandwidth, + availability=_qos.availability, + loss=_qos.loss, + ber=_qos.ber, + max_gap=_qos.max_gap, + timeout=_qos.timeout) |
