def evaluate_string()

in qs_cfn_lint_rules/stack/StackHelper.py [0:0]


def evaluate_string(template_url, depth=0):
    """Recursively find expressions in the URL and send them to be evaluated"""
    # Recursion bail out
    if depth > MAX_DEPTH:
        raise Exception("Template URL contains more than {} levels or nesting".format(MAX_DEPTH))

    template_urls = []
    # Evaluate expressions
    if "{" in template_url:
        parts = template_url.split("{")
        parts = parts[-1].split("}")  # Last open bracket

        # This function will handle Fn::Sub Fn::If etc.
        replacements = evaluate_expression_controller(parts[0])  # First closed bracket after

        for replacement in replacements:
            template_url_temp = template_url
            # print("evaluate_string: (before) {}".format(template_url))
            # print("expression: {}".format(parts[0]))
            # print("replacement: {}".format(replacement))
            template_url_temp = template_url_temp.replace("{" + parts[0] + "}", replacement)
            # print("evaluate_string: (after) {}".format(template_url_temp))

            evaluated_strings = evaluate_string(template_url_temp, depth=(depth+1))
            for evaluated_string in evaluated_strings:
                template_urls.append(evaluated_string)
    else:
        template_urls.append(template_url)

    return template_urls