def tomap(original, **_): original = original.replace(":", "=") # converted to colons by parser #shrug altered_value = eval_string(original) if altered_value is None or not isinstance(altered_value, dict): return FUNCTION_FAILED # If there is a string and anything else, convert to string had_string = False had_something_else = False for k, v in altered_value.items(): if v == "${True}": altered_value[k] = True v = True elif v == "${False}": altered_value[k] = False v = False if isinstance(v, str): had_string = True if had_something_else: break else: had_something_else = True if had_string: break if had_string and had_something_else: return {k: to_string(v) for k, v in altered_value.items()} return altered_value
def toset(original, **_): # https://www.terraform.io/docs/configuration/functions/toset.html altered_value = eval_string(original) if altered_value is None: return FUNCTION_FAILED return altered_value if isinstance(altered_value, set) else set(altered_value)
def tomap(original, **_): # https://www.terraform.io/docs/language/functions/tomap.html original = original.replace(":", "=") # converted to colons by parser #shrug altered_value = eval_string(original) if altered_value is None or not isinstance(altered_value, dict): return FUNCTION_FAILED return _check_map_type_consistency(altered_value)
def map(original, **_): # https://www.terraform.io/docs/language/functions/map.html # NOTE: Splitting by commas is annoying due to possible commas in strings. To avoid # the issue, act like it's a list (to allow comma separation) and let the HCL # parser deal with it. Then iterating the list is easy. converted_to_list = eval_string(f"[{original}]") if converted_to_list is None or len( converted_to_list) & 1: # none or odd number of args return FUNCTION_FAILED return create_map(converted_to_list)
def concat(original, var_resolver, **_): args = split_merge_args(original) if args is None: return FUNCTION_FAILED merged_list = [] for arg in args: if arg.startswith("["): value = eval_string(arg) if value is None: logging.debug("Unable to convert to list: %s", arg) return FUNCTION_FAILED else: value = var_resolver(arg) if isinstance(value, list): merged_list.extend(value) else: return FUNCTION_FAILED # don't know what this is, blow out return merged_list
def _to_native_value(value: str) -> Any: if value.startswith('"') or value.startswith("'"): return value[1:-1] else: return eval_string(value)