aboutsummaryrefslogtreecommitdiff
path: root/ouroboros/_qosspec.py
diff options
context:
space:
mode:
Diffstat (limited to 'ouroboros/_qosspec.py')
-rw-r--r--ouroboros/_qosspec.py61
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)