]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Implement default values for the simple config parser
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 21 Oct 2024 18:02:22 +0000 (20:02 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 21 Oct 2024 18:59:51 +0000 (20:59 +0200)
mkosi/config.py

index 0bb255685f18560f5a1a777e52f9c292e91f2876..28a0c90bd8a25ace23037d16872ba06443d6807f 100644 (file)
@@ -1532,7 +1532,24 @@ class UKIProfile:
 
 
 def make_simple_config_parser(settings: Sequence[ConfigSetting], type: type[Any]) -> Callable[[str], Any]:
-    lookup = {s.name: s for s in settings}
+    lookup_by_name = {s.name: s for s in settings}
+    lookup_by_dest = {s.dest: s for s in settings}
+
+    def finalize_value(config: argparse.Namespace, setting: ConfigSetting) -> None:
+        if hasattr(config, setting.dest):
+            return
+
+        if setting.default_factory:
+            for d in setting.default_factory_depends:
+                finalize_value(config, lookup_by_dest[d])
+
+            default = setting.default_factory(config)
+        elif setting.default:
+            default = setting.default
+        else:
+            default = setting.parse(None, None)
+
+        setattr(config, setting.dest, default)
 
     def parse_simple_config(value: str) -> Any:
         path = parse_path(value)
@@ -1542,7 +1559,7 @@ def make_simple_config_parser(settings: Sequence[ConfigSetting], type: type[Any]
             if not name and not value:
                 continue
 
-            if not (s := lookup.get(name)):
+            if not (s := lookup_by_name.get(name)):
                 die(f"{path.absolute()}: Unknown setting {name}")
 
             if section != s.section:
@@ -1558,6 +1575,9 @@ def make_simple_config_parser(settings: Sequence[ConfigSetting], type: type[Any]
 
             setattr(config, s.dest, s.parse(value, getattr(config, s.dest, None)))
 
+        for setting in settings:
+            finalize_value(config, setting)
+
         return type(**{k: v for k, v in vars(config).items() if k in inspect.signature(type).parameters})
 
     return parse_simple_config