Nyx Node
Loading...
Searching...
No Matches
utils.py
1# -*- coding: utf-8 -*-
2########################################################################################################################
3# NyxNode
4# Author: Jérôme ODIER <jerome.odier@lpsc.in2p3.fr>
5# SPDX-License-Identifier: GPL-3.0+
6########################################################################################################################
7
8import typing
9
10########################################################################################################################
11
12def nyx_property(name: str, key: str, kind: typing.Type = str, getter: typing.Callable[[typing.Any], typing.Any] | None = None, setter: typing.Callable | None = None) -> typing.Callable:
13
14 def decorate(cls: type) -> type:
15
16 ################################################################################################################
17
18 if name in cls.__dict__:
19
20 raise AttributeError(f'Nyx property already exists: {name}')
21
22 ################################################################################################################
23
24 def get_value(self) -> kind:
25 f"""
26 @brief Gets the @c {name} attribute of this object (type: @c {kind.__name__}).'
27
28 @return The current value.
29 """
30
31 value = self[key].value
32
33 if getter is not None:
34
35 value = getter(value)
36
37 return kind(value)
38
39 ################################################################################################################
40
41 def set_value(self, value: kind) -> None:
42 f"""
43 @brief Sets the @c {name} attribute of this object (type: @c {kind.__name__}).'
44
45 @return None
46 """
47
48 if setter is not None:
49
50 value = setter(value)
51
52 self[key].value = value
53
54 ################################################################################################################
55
56 setattr(cls, name, property(get_value, set_value))
57
58 ################################################################################################################
59
60 return cls
61
62 return decorate
63
64########################################################################################################################
65
66__all__ = [name for name in globals() if name.lower().startswith('nyx')]
67
68########################################################################################################################