import re

VARIABLE_PATTERN = re.compile(r"\{(\w+)\}")


def extract_variables(template: str) -> list[str]:
    return list(dict.fromkeys(VARIABLE_PATTERN.findall(template)))


def render_template(template: str, variables: dict[str, str] | None = None) -> str:
    variables = variables or {}
    required = extract_variables(template)
    missing = [name for name in required if name not in variables or not variables[name].strip()]
    if missing:
        raise ValueError(f"缺少变量: {', '.join(missing)}")
    return template.format(**variables)
