def evaluate()

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