diff options
Diffstat (limited to 'mesonbuild/mesonlib.py')
-rw-r--r-- | mesonbuild/mesonlib.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 03fbf02..5df7311 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -1495,3 +1495,33 @@ def get_wine_shortpath(winecmd, wine_paths): len(wine_path))) return wine_path.strip(';') + + +class OptionProxy: + def __init__(self, value): + self.value = value + +class OptionOverrideProxy: + '''Mimic an option list but transparently override + selected option values.''' + def __init__(self, overrides, *options): + self.overrides = overrides + self.options = options + + def __getitem__(self, option_name): + for opts in self.options: + if option_name in opts: + return self._get_override(option_name, opts[option_name]) + raise KeyError('Option not found', option_name) + + def _get_override(self, option_name, base_opt): + if option_name in self.overrides: + return OptionProxy(base_opt.validate_value(self.overrides[option_name])) + return base_opt + + def copy(self): + result = {} + for opts in self.options: + for option_name in opts: + result[option_name] = self._get_override(option_name, opts[option_name]) + return result |