in cfn_policy_validator/parsers/utils/intrinsic_functions/fn_sub_evaluator.py [0:0]
def evaluate(self, value: CfnObject, visited_values: list = None):
if visited_values is None:
visited_values = []
validate_fn_sub_schema(value)
# There are two ways or writing a Fn::Sub function, a list and a string
if isinstance(value, list):
# a Fn::Sub with a list value has a variable map
string_to_evaluate = value[0]
variable_mapping = value[1]
variables_in_string = re.findall(regex_patterns.fn_sub_variables, string_to_evaluate)
for variable_in_string in variables_in_string:
variable_value = variable_mapping.get(variable_in_string)
if variable_value is not None:
variable_value = self.node_evaluator.eval_with_validation(variable_value, string_schema, visited_values=visited_values)
string_to_evaluate = string_to_evaluate.replace("${" + variable_in_string + "}", variable_value)
else:
# this will throw if it can't find the variable anywhere
string_to_evaluate = self._evaluate_ref_or_get_att_in_sub(string_to_evaluate, variable_in_string, visited_values)
return string_to_evaluate
else:
# the sub is a string value
variables_in_string = re.findall(regex_patterns.fn_sub_variables, value)
for variable_in_string in variables_in_string:
value = self._evaluate_ref_or_get_att_in_sub(value, variable_in_string, visited_values)
return value