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

192 lines
5.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
{
class Python3JsonCodeRender : 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}}(Enum):
{{~ 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_beanRender;
public override string Render(DefBean b)
{
var template = t_beanRender ??= Template.Parse(@"
{{
name = x.py_full_name
is_abstract_type = x.is_abstract_type
parent_def_type = x.parent_def_type
export_fields = x.export_fields
hierarchy_export_fields = x.hierarchy_export_fields
}}
class {{name}} {{if parent_def_type}}({{parent_def_type.py_full_name}}){{else if is_abstract_type}}(metaclass=abc.ABCMeta){{end}}:
{{~if x.is_abstract_type~}}
_childrenTypes = None
@staticmethod
def fromJson(_json_):
childrenTypes = {{name}}._childrenTypes
if not childrenTypes:
childrenTypes = {{name}}._childrenTypes = {
{{~ for child in x.hierarchy_not_abstract_children~}}
'{{child.name}}': {{child.py_full_name}},
{{~end~}}
}
type = _json_['__type__']
child = {{name}}._childrenTypes.get(type)
if child != None:
return child(_json_)
else:
raise Exception()
{{~end~}}
def __init__(self, _json_):
{{~if parent_def_type~}}
{{parent_def_type.py_full_name}}.__init__(self, _json_)
{{~end~}}
{{~ for field in export_fields ~}}
{{~if !field.ctype.is_nullable~}}
if _json_['{{field.name}}'] == None: raise Exception()
{{~end~}}
{{py3_deserialize ('self.' + field.py_style_name) ('_json_[""' + field.name + '""]') field.ctype}}
{{~end~}}
{{~if export_fields.empty?}}
pass
{{~end~}}
");
var result = template.RenderCode(b);
return result;
}
[ThreadStatic]
private static Template t_tableRender;
public override string Render(DefTable p)
{
var template = t_tableRender ??= Template.Parse(@"
{{
name = x.py_full_name
key_type = x.key_ttype
key_type1 = x.key_ttype1
key_type2 = x.key_ttype2
value_type = x.value_ttype
}}
class {{name}}:
{{~if x.is_map_table ~}}
def __init__(self, _json_ ):
self._dataMap = {}
self._dataList = []
for _json2_ in _json_:
{{py3_deserialize '_v' '_json2_' value_type}}
self._dataList.append(_v)
self._dataMap[_v.{{x.index_field.py_style_name}}] = _v
def getDataMap(self) : return self._dataMap
def getDataList(self) : return self._dataList
def get(self, key) : return self._dataMap.get(key)
{{~else~}}
def __init__(self, _json_):
if (len(_json_) != 1): raise Exception('table mode=one, but size != 1')
{{py3_deserialize 'self._data' '_json_[0]' value_type}}
def getData(self) : return self._data
{{~ for field in value_type.bean.hierarchy_export_fields ~}}
def {{field.py_style_name}}(self) : return self._data.{{field.py_style_name}}
{{~end~}}
{{~end~}}
");
var result = template.RenderCode(p);
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.json_output_data_file}}'));
{{~end~}}
");
var result = template.RenderCode(new
{
Name = name,
Namespace = module,
Tables = tables,
});
return result;
}
}
}