2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-10 02:31:49 +00:00

chore: add ability for zcg to generate files once per template

This commit is contained in:
Jan Laupetin
2026-01-05 12:15:14 +00:00
parent 11fdb4ad59
commit 660f34df69
17 changed files with 166 additions and 53 deletions

View File

@@ -28,9 +28,9 @@ void CodeGenerator::SetupTemplates()
m_template_mapping["assetstructtests"] = std::make_unique<AssetStructTestsTemplate>();
}
bool CodeGenerator::GenerateCodeForTemplate(const RenderingContext& context, ICodeTemplate* codeTemplate) const
bool CodeGenerator::GenerateCodeOncePerTemplate(const OncePerTemplateRenderingContext& context, ICodeTemplate* codeTemplate) const
{
for (const auto& codeFile : codeTemplate->GetFilesToRender(context))
for (const auto& codeFile : codeTemplate->GetFilesToRenderOncePerTemplate(context))
{
fs::path p(m_args->m_output_directory);
p.append(codeFile.m_file_name);
@@ -47,7 +47,34 @@ bool CodeGenerator::GenerateCodeForTemplate(const RenderingContext& context, ICo
return false;
}
codeTemplate->RenderFile(stream, codeFile.m_tag, context);
codeTemplate->RenderOncePerTemplateFile(stream, codeFile.m_tag, context);
stream.close();
}
return true;
}
bool CodeGenerator::GenerateCodeOncePerAsset(const OncePerAssetRenderingContext& context, ICodeTemplate* codeTemplate) const
{
for (const auto& codeFile : codeTemplate->GetFilesToRenderOncePerAsset(context))
{
fs::path p(m_args->m_output_directory);
p.append(codeFile.m_file_name);
auto parentFolder(p);
parentFolder.remove_filename();
create_directories(parentFolder);
std::ofstream stream(p, std::fstream::out | std::fstream::binary);
if (!stream.is_open())
{
con::error("Failed to open file '{}'", p.string());
return false;
}
codeTemplate->RenderOncePerAssetFile(stream, codeFile.m_tag, context);
stream.close();
}
@@ -101,14 +128,14 @@ bool CodeGenerator::GenerateCode(const IDataRepository* repository)
const auto foundTemplate = m_template_mapping.find(lowerTemplateName);
if (foundTemplate == m_template_mapping.end())
{
con::error("Unknown template '{}'.", templateName);
con::error("Unknown template '{}'", templateName);
return false;
}
for (auto* asset : assets)
{
auto context = RenderingContext::BuildContext(repository, asset);
if (!GenerateCodeForTemplate(*context, foundTemplate->second.get()))
auto context = OncePerAssetRenderingContext::BuildContext(repository, asset);
if (!GenerateCodeOncePerAsset(*context, foundTemplate->second.get()))
{
con::error("Failed to generate code for asset '{}' with preset '{}'", asset->m_definition->GetFullName(), foundTemplate->first);
return false;
@@ -116,6 +143,17 @@ bool CodeGenerator::GenerateCode(const IDataRepository* repository)
con::info("Successfully generated code for asset '{}' with preset '{}'", asset->m_definition->GetFullName(), foundTemplate->first);
}
{
auto context = OncePerTemplateRenderingContext::BuildContext(repository);
if (!GenerateCodeOncePerTemplate(*context, foundTemplate->second.get()))
{
con::error("Failed to generate code with preset '{}'", foundTemplate->first);
return false;
}
con::info("Successfully generated code with preset '{}'", foundTemplate->first);
}
}
const auto end = std::chrono::steady_clock::now();
con::debug("Generating code took {}ms", std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count());