moto/moto/ses/template.py
2023-01-19 18:27:39 -01:00

46 lines
1.7 KiB
Python

from .exceptions import MissingRenderingAttributeException
from moto.utilities.tokenizer import GenericTokenizer
def parse_template(template, template_data, tokenizer=None, until=None):
tokenizer = tokenizer or GenericTokenizer(template)
state = ""
parsed = ""
var_name = ""
for char in tokenizer:
if until is not None and (char + tokenizer.peek(len(until) - 1)) == until:
return parsed
if char == "{":
tokenizer.skip_characters("{")
tokenizer.skip_white_space()
if tokenizer.peek() == "#":
state = "LOOP"
tokenizer.skip_characters("#each")
tokenizer.skip_white_space()
else:
state = "VAR"
continue
if char == "}":
if state in ["LOOP", "VAR"]:
tokenizer.skip_characters("}")
if state == "VAR":
if template_data.get(var_name) is None:
raise MissingRenderingAttributeException(var_name)
parsed += template_data.get(var_name)
else:
current_position = tokenizer.token_pos
for item in template_data.get(var_name, []):
tokenizer.token_pos = current_position
parsed += parse_template(
template, item, tokenizer, until="{{/each}}"
)
tokenizer.skip_characters("{/each}}")
var_name = ""
state = ""
continue
if state in ["LOOP", "VAR"]:
var_name += char
continue
parsed += char
return parsed