super().__init__()
self.comment = f"{comment} at {datetime.now()}"
+class BlockOption:
+ def __init__(self, config_text, _type, value):
+ if not isinstance(value, _type):
+ raise Exception("BlockOption value doesn't match declared type")
+
+ self.config_text = config_text
+ self._type = _type
+ self.value = value
+
+ def set(self, value):
+ if value == self.value:
+ return self
+ else:
+ return type(self)(self.config_text, self._type, value)
+
class ProtocolConfig(ConfigObject):
- def __init__(self, name=None, template=None):
+ options = {
+ "disabled": BlockOption("disabled", bool, False),
+ }
+
+ def __init__(self, name=None, template=None, **kwargs):
super().__init__()
self.name = name
+
if template is not None:
raise NotImplementedError()
+ self.options_set = {}
+ for k in kwargs:
+ if k not in self.options:
+ raise NotImplementedError()
+
+ self.options_set[k] = self.options[k].set(kwargs[k])
+
def block_inside(self, indent):
- return None
+ if len(self.options_set) == 0:
+ return None
+
+ return ("\n" + " " * indent).join([""] + [
+ f"{opt.config_text} {opt.value};" for k,opt in self.options_set.items() if opt != self.options[k]
+ ])
def __str__(self):
inside = self.block_inside(1)
if inside is None:
return header + " {}\n"
else:
- return header + " {\n" + inside + "}\n"
+ return header + " {" + inside + "\n}\n"
class DeviceProtocolConfig(ProtocolConfig):
name_prefix = "device"
protocol_type = "device"
+ options = ProtocolConfig.options | {
+ "scan_time": BlockOption("scan time", int, 60),
+ }
def __enter__(self):
if self.config.auto_device:
self.auto_device = DeviceProtocolConfig()
- self.config.add(self.auto_device)
self.begin = Timestamp("Config dump started")
self.config.add(self.begin)
def dump(self, _file):
for i in self.config._items:
- if i is not None:
- _file.write(str(i))
+ if i is None:
+ continue
+ if isinstance(i, DeviceProtocolConfig):
+ self.auto_device = None
+
+ _file.write(str(i))
+
+ if self.auto_device is not None:
+ _file.write(str(self.auto_device))
_file.write(str(Timestamp("Config dump finished")))
def __exit__(self, *args):
self.config.remove(self.begin)
- if self.auto_device is not None:
- self.config.remove(self.auto_device)
def finalized(self):
return self.FinalizedConfig(self)