1cb93a386Sopenharmony_ci# select_multi works around a restriction in native select() that prevents multiple
2cb93a386Sopenharmony_ci# keys from being matched unless one is a strict subset of another. For some features,
3cb93a386Sopenharmony_ci# we allow multiple of that component to be active. For example, with codecs, we let
4cb93a386Sopenharmony_ci# the clients mix and match anywhere from 0 built in codecs to all of them.
5cb93a386Sopenharmony_ci#
6cb93a386Sopenharmony_ci# select_multi takes a given map and turns it into several distinct select statements
7cb93a386Sopenharmony_ci# that have the effect of using any values associated with any active keys.
8cb93a386Sopenharmony_ci# For example, if the following parameters are passed in:
9cb93a386Sopenharmony_ci#    values_map = {
10cb93a386Sopenharmony_ci#        ":alpha": ["apple", "apricot"],
11cb93a386Sopenharmony_ci#        ":beta": ["banana"],
12cb93a386Sopenharmony_ci#        ":gamma": ["grapefruit"],
13cb93a386Sopenharmony_ci#    },
14cb93a386Sopenharmony_ci#    default = []
15cb93a386Sopenharmony_ci# it will be unrolled into the following select statements
16cb93a386Sopenharmony_ci#    [] + select({
17cb93a386Sopenharmony_ci#        ":apple": ["apple", "apricot"],
18cb93a386Sopenharmony_ci#        "//conditions:default": [],
19cb93a386Sopenharmony_ci#    }) + select({
20cb93a386Sopenharmony_ci#        ":beta": ["banana"],
21cb93a386Sopenharmony_ci#        "//conditions:default": [],
22cb93a386Sopenharmony_ci#    }) + select({
23cb93a386Sopenharmony_ci#        ":gamma": ["grapefruit"],
24cb93a386Sopenharmony_ci#        "//conditions:default": [],
25cb93a386Sopenharmony_ci#    })
26cb93a386Sopenharmony_cidef select_multi(values_map, default):
27cb93a386Sopenharmony_ci    if len(values_map) == 0:
28cb93a386Sopenharmony_ci        return default
29cb93a386Sopenharmony_ci    rv = []
30cb93a386Sopenharmony_ci    for key, value in values_map.items():
31cb93a386Sopenharmony_ci        rv += select({
32cb93a386Sopenharmony_ci            key: value,
33cb93a386Sopenharmony_ci            "//conditions:default": default,
34cb93a386Sopenharmony_ci        })
35cb93a386Sopenharmony_ci    return rv
36