luban/src/Luban.Job.Cfg/Source/Generate/PythonCodeRenderBase.cs

90 lines
2.1 KiB
C#

using Luban.Job.Cfg.Defs;
using Luban.Job.Common.Defs;
using Scriban;
using System;
using System.Collections.Generic;
namespace Luban.Job.Cfg.Generate
{
abstract class PythonCodeRenderBase : CodeRenderBase
{
[ThreadStatic]
private static Template t_tsConstRender;
public override string Render(DefConst c)
{
var ctx = new TemplateContext();
var env = new TTypeTemplateCommonExtends
{
["x"] = c
};
ctx.PushGlobal(env);
var template = t_tsConstRender ??= Template.Parse(@"
class {{x.py_full_name}}:
{{~ for item in x.items ~}}
{{item.name}} = {{py_const_value item.ctype item.value}}
{{~end~}}
{{~if (x.items == empty)~}}
pass
{{~end~}}
");
var result = template.Render(ctx);
return result;
}
[ThreadStatic]
private static Template t_tsEnumRender;
public override string Render(DefEnum e)
{
var template = t_tsEnumRender ??= Template.Parse(@"
class {{py_full_name}}:
{{~ for item in items ~}}
{{item.name}} = {{item.value}}
{{~end~}}
{{~if (items == empty)~}}
pass
{{~end~}}
");
var result = template.Render(e);
return result;
}
[ThreadStatic]
private static Template t_serviceRender;
public override string RenderService(string name, string module, List<DefTable> tables)
{
var template = t_serviceRender ??= Template.Parse(@"
{{
name = x.name
namespace = x.namespace
tables = x.tables
}}
class {{name}}:
{{~ for table in tables ~}}
#def {{table.name}} : return self._{{table.name}}
{{~end~}}
def __init__(self, loader):
{{~for table in tables ~}}
self.{{table.name}} = {{table.py_full_name}}(loader('{{table.output_data_file}}'));
{{~end~}}
");
var result = template.RenderCode(new
{
Name = name,
Namespace = module,
Tables = tables,
});
return result;
}
}
}