import os import json from typing import Any from botbuilder.schema import Attachment class TemplateEngine: def __init__(self, template_name: str, template_path: str = "templates/") -> None: self.__name = template_name self.__path = template_path self.__template_path = f"{self.__path}{self.__name}.json" self.__template = self.__load_template() def __load_template(self) -> dict[str, Any]: with open(self.__template_path, "r", encoding="utf-8") as f: return json.loads(f.read()) def __replace_placeholders(self, obj: Any, data: dict) -> Any: """Recursively replace placeholders in dict/list/string values.""" if isinstance(obj, dict): return {k: self.__replace_placeholders(v, data) for k, v in obj.items()} elif isinstance(obj, list): return [self.__replace_placeholders(item, data) for item in obj] elif isinstance(obj, str): return obj.format(**data) else: return obj def __generate_card(self, data: dict) -> dict[str, Any]: template = self.__load_template() return self.__replace_placeholders(template, data) def generate(self, data: dict) -> dict[str, Any]: return self.__generate_card(data) def attachment(self, data: dict) -> Attachment: return Attachment( content_type="application/vnd.microsoft.card.adaptive", content=self.generate(data) ) def json_dict(self, data: dict) -> dict: return self.generate(data) def json(self, data: dict) -> str: return json.dumps(self.generate(data))