in Explode/lambda/explode.py [0:0]
def walk_resource(resource, map_data):
"""Recursively process a resource."""
new_resource = {}
for key, value in resource.items():
if isinstance(value, dict):
new_resource[key] = walk_resource(value, map_data)
elif isinstance(value, list):
new_resource[key] = [walk_resource(x, map_data) for x in value]
elif isinstance(value, str):
match = EXPLODE_RE.search(value)
while match:
explode_key = match.group('explode_key')
try:
replace_value = map_data[explode_key]
except KeyError:
print("Missing item {} in mapping while processing {}: {}".format(
explode_key,
key,
value))
if isinstance(replace_value, int):
value = replace_value
# No further explosion is possible on an int
match = None
else:
value = value.replace(match.group(0), replace_value)
match = EXPLODE_RE.search(value)
new_resource[key] = value
else:
new_resource[key] = value
return new_resource