|
20 | 20 | from __future__ import annotations |
21 | 21 |
|
22 | 22 | from dataclasses import dataclass, field, fields |
23 | | -from functools import lru_cache |
24 | | -from typing import Any, Dict, List, Optional, Type, cast |
| 23 | +from typing import Any, Dict, List, Optional |
25 | 24 |
|
26 | | -from .types import ( |
27 | | - NetworkManagerConnectionProperties, |
28 | | - NetworkManagerSettingsDomain, |
29 | | -) |
| 25 | +from .settings.base import NetworkManagerSettingsMixin |
| 26 | +from .settings.datatypes import AddressData, RouteData |
| 27 | +from .types import NetworkManagerConnectionProperties |
30 | 28 |
|
31 | 29 | # See https://networkmanager.dev/docs/api/latest/nm-settings-dbus.html |
32 | 30 | # for list of all settings |
33 | 31 |
|
34 | 32 |
|
35 | | -class NetworkManagerSettingsMixin: |
36 | | - |
37 | | - def to_dbus(self) -> NetworkManagerSettingsDomain: |
38 | | - new_dict: NetworkManagerSettingsDomain = {} |
39 | | - |
40 | | - for x in fields(self): |
41 | | - value = getattr(self, x.name) |
42 | | - if value is None: |
43 | | - continue |
44 | | - |
45 | | - if x.metadata['dbus_type'] == 'aa{sv}': |
46 | | - packed_variant = ('aa{sv}', [x.to_dbus() for x in value]) |
47 | | - else: |
48 | | - packed_variant = (x.metadata['dbus_type'], value) |
49 | | - |
50 | | - new_dict[x.metadata['dbus_name']] = packed_variant |
51 | | - |
52 | | - return new_dict |
53 | | - |
54 | | - @classmethod |
55 | | - def _unpack_variant(cls, key: str, signature: str, value: Any) -> Any: |
56 | | - if signature == 'aa{sv}': |
57 | | - inner_class = cls.setting_name_to_inner_class(key) |
58 | | - return [inner_class.from_dbus(x) for x in value] |
59 | | - |
60 | | - return value |
61 | | - |
62 | | - @classmethod |
63 | | - def from_dbus(cls, |
64 | | - dbus_dict: NetworkManagerSettingsDomain, |
65 | | - ) -> NetworkManagerSettingsMixin: |
66 | | - |
67 | | - reverse_mapping = cls.setting_name_reverse_mapping() |
68 | | - unvarianted_options = { |
69 | | - reverse_mapping[k]: cls._unpack_variant(k, *v) |
70 | | - for k, v in dbus_dict.items()} |
71 | | - |
72 | | - return cls(**unvarianted_options) |
73 | | - |
74 | | - @classmethod |
75 | | - @lru_cache(maxsize=None) |
76 | | - def setting_name_reverse_mapping(cls) -> Dict[str, str]: |
77 | | - return {f.metadata['dbus_name']: f.name for f in fields(cls)} |
78 | | - |
79 | | - @classmethod |
80 | | - @lru_cache(maxsize=None) |
81 | | - def setting_name_to_inner_class(cls, setting_name: str) -> Type[Any]: |
82 | | - for x in fields(cls): |
83 | | - if setting_name != x.metadata['dbus_name']: |
84 | | - continue |
85 | | - |
86 | | - return cast(Type[Any], x.metadata['dbus_inner_class']) |
87 | | - |
88 | | - raise ValueError('Inner class not found') |
89 | | - |
90 | | - |
91 | 33 | @dataclass |
92 | 34 | class ConnectionSettings(NetworkManagerSettingsMixin): |
93 | 35 | auth_retries: Optional[int] = field( |
@@ -196,34 +138,6 @@ class ConnectionSettings(NetworkManagerSettingsMixin): |
196 | 138 | ) |
197 | 139 |
|
198 | 140 |
|
199 | | -@dataclass |
200 | | -class AddressData(NetworkManagerSettingsMixin): |
201 | | - address: str = field( |
202 | | - metadata={'dbus_name': 'address', 'dbus_type': 's'}, |
203 | | - ) |
204 | | - prefix: int = field( |
205 | | - metadata={'dbus_name': 'prefix', 'dbus_type': 'u'}, |
206 | | - ) |
207 | | - |
208 | | - |
209 | | -@dataclass |
210 | | -class RouteData(NetworkManagerSettingsMixin): |
211 | | - dest: str = field( |
212 | | - metadata={'dbus_name': 'dest', 'dbus_type': 's'}, |
213 | | - ) |
214 | | - prefix: int = field( |
215 | | - metadata={'dbus_name': 'prefix', 'dbus_type': 'u'}, |
216 | | - ) |
217 | | - next_hop: Optional[str] = field( |
218 | | - metadata={'dbus_name': 'next-hop', 'dbus_type': 's'}, |
219 | | - default=None, |
220 | | - ) |
221 | | - metric: Optional[int] = field( |
222 | | - metadata={'dbus_name': 'metric', 'dbus_type': 'u'}, |
223 | | - default=None, |
224 | | - ) |
225 | | - |
226 | | - |
227 | 141 | @dataclass |
228 | 142 | class Ipv4Settings(NetworkManagerSettingsMixin): |
229 | 143 | address_data: Optional[List[AddressData]] = field( |
|
0 commit comments