This commit is contained in:
huangjun
2026-08-30 07:48:19 +08:00
commit 42ad134759
551 changed files with 68412 additions and 0 deletions
@@ -0,0 +1,23 @@
{{~
comment = __enum.comment
items = __enum.items
~}}
{{namespace_with_grace_begin __namespace}}
{{~if comment != '' ~}}
/// <summary>
/// {{escape_comment comment}}
/// </summary>
{{~end~}}
enum class {{__name}}
{
{{~ for item in items ~}}
{{~if item.comment != '' ~}}
/// <summary>
/// {{escape_comment item.comment_or_alias}}
/// </summary>
{{~end~}}
{{format_enum_item_name __code_style item.name}} = {{item.value}},
{{~end~}}
};
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,28 @@
{{~
comment = __enum.comment
items = __enum.items
~}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if comment != '' ~}}
/// <summary>
/// {{escape_comment comment}}
/// </summary>
{{~end~}}
{{~if __enum.is_flags~}}
[System.Flags]
{{~end~}}
public enum {{__name}}
{
{{~ for item in items ~}}
{{~if item.comment != '' ~}}
/// <summary>
/// {{escape_comment item.comment_or_alias}}
/// </summary>
{{~end~}}
{{format_enum_item_name __code_style item.name}} = {{item.value}},
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,19 @@
{{~if ___top_module != ''~}}
package {{__top_module}};
{{~end~}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
const (
{{~ for item in __this.items ~}}
{{~if item.comment_or_alias != '' ~}}
/**
* {{escape_comment item.comment_or_alias}}
*/
{{~end~}}
{{full_name __this}}_{{item.name}} = {{item.int_value}};
{{~end~}}
)
@@ -0,0 +1,19 @@
{{~if __namespace_with_top_module != ''~}}
package {{__namespace_with_top_module}};
{{~end~}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
public final class {{__name}} {
{{~ for item in __this.items ~}}
{{~if item.comment_or_alias != '' ~}}
/**
* {{escape_comment item.comment_or_alias}}
*/
{{~end~}}
public static final int {{item.name}} = {{item.int_value}};
{{~end~}}
}
@@ -0,0 +1,2 @@
@@ -0,0 +1,32 @@
{{namespace_with_grace_begin __namespace}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
struct {{__name}} : public{{if __parent_def_type}} {{make_cpp_name __parent_def_type.full_name}} {{else}} luban::CfgBean {{end}}
{
static bool deserialize{{__name}}(::luban::ByteBuf& _buf, ::luban::SharedPtr<{{__name}}>& _out);
virtual ~{{__name}}() {}
bool deserialize(::luban::ByteBuf& _buf);
{{~ for field in __export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
{{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
{{~end~}}
{{~if !__this.is_abstract_type~}}
static constexpr int __ID__ = {{__this.id}};
int getTypeId() const override { return __ID__; }
{{~end~}}
};
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,50 @@
#include "{{__schema_header_file}}"
{{namespace_with_grace_begin __top_module}}
{{~for bean in __beans~}}
bool {{make_cpp_name bean.full_name}}::deserialize(::luban::ByteBuf& _buf)
{
{{~if bean.parent_def_type~}}
if (!{{make_cpp_name bean.parent_def_type.full_name}}::deserialize(_buf))
{
return false;
}
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{deserialize '_buf' (format_field_name __code_style field.name) field.ctype}}
{{~end~}}
return true;
}
bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, ::luban::SharedPtr<{{make_cpp_name bean.full_name}}>& _out)
{
{{~if bean.is_abstract_type~}}
int id;
if (!_buf.readInt(id)) return false;
switch (id)
{
{{~for child in bean.hierarchy_not_abstract_children~}}
case {{make_type_cpp_name child}}::__ID__: { _out.reset(new {{make_type_cpp_name child}}()); if (_out->deserialize(_buf)) { return true; } else { _out.reset(); return false;} }
{{~end~}}
default: { _out = nullptr; return false;}
}
{{~else~}}
_out.reset(new {{make_type_cpp_name bean}}());
if (_out->deserialize(_buf))
{
return true;
}
else
{
_out.reset();
return false;
}
{{~end~}}
}
{{~end~}}
{{namespace_with_grace_end __top_module}}
@@ -0,0 +1,21 @@
#pragma once
#include <functional>
#include <algorithm>
#include "CfgBean.h"
{{namespace_with_grace_begin __top_module}}
{{__enum_codes~}}
{{~for b in __beans~}}
{{namespace_with_grace_begin b.namespace}} struct {{b.name}}; {{namespace_with_grace_end b.namespace}}
{{~end~}}
{{~__bean_codes~}}
{{~__table_codes~}}
{{__tables_code}}
{{namespace_with_grace_end __top_module}}
@@ -0,0 +1,140 @@
{{namespace_with_grace_begin __namespace}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
class {{__name}}
{
{{~if __this.is_map_table ~}}
private:
::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
public:
bool load(::luban::ByteBuf& _buf)
{
int n;
if (!_buf.readSize(n)) return false;
for(; n > 0 ; --n)
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_buf' '_v' __value_type}}
_dataList.push_back(_v);
_dataMap[_v->{{format_field_name __code_style __this.index_field.name}}] = _v;
}
return true;
}
const ::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>& getDataMap() const { return _dataMap; }
const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
{{make_type_cpp_name __value_type.def_bean}}* getRaw({{declaring_type_name __key_type}} key)
{
auto it = _dataMap.find(key);
return it != _dataMap.end() ? it->second.get() : nullptr;
}
{{declaring_type_name __value_type}} get({{declaring_type_name __key_type}} key)
{
auto it = _dataMap.find(key);
return it != _dataMap.end() ? it->second : nullptr;
}
{{~else if __this.is_list_table~}}
private:
::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
{{~if __this.is_union_index~}}
{{~else if !__this.index_list.empty?~}}
{{~for idx in __this.index_list~}}
::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
{{~end~}}
{{~else~}}
{{~end~}}
public:
bool load(::luban::ByteBuf& _buf)
{
int n;
if (!_buf.readSize(n)) return false;
for(; n > 0 ; --n)
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_buf' '_v' __value_type}}
_dataList.push_back(_v);
{{~if __this.is_union_index~}}
{{~else if !__this.index_list.empty?~}}
{{~for idx in __this.index_list~}}
_dataMap_{{idx.index_field.name}}[_v->{{idx.index_field.name}}] = _v;
{{~end~}}
{{~else~}}
{{~end~}}
}
return true;
}
const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
{{~if __this.is_union_index~}}
{{~else if !__this.index_list.empty?~}}
{{~for idx in __this.index_list~}}
::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>& getDataMapBy{{idx.index_field.name}}()
{
return _dataMap_{{idx.index_field.name}};
}
{{make_type_cpp_name __value_type.def_bean}}* getRawBy{{idx.index_field.name}}({{declaring_type_name idx.type}} key)
{
auto it = _dataMap_{{idx.index_field.name}}.find(key);
return it != _dataMap_{{idx.index_field.name}}.end() ? it->second.get() : nullptr;
}
{{declaring_type_name __value_type}} getBy{{idx.index_field.name}}({{declaring_type_name idx.type}} key)
{
auto it = _dataMap_{{idx.index_field.name}}.find(key);
return it != _dataMap_{{idx.index_field.name}}.end() ? it->second : nullptr;
}
{{~end~}}
{{~else~}}
{{make_type_cpp_name __value_type.def_bean}}* getRaw(size_t index) const
{
return _dataList[index].get();
}
{{declaring_type_name __value_type}} get(size_t index) const
{
return _dataList[index];
}
{{~end~}}
{{~else~}}
private:
{{declaring_type_name __value_type}} _data;
public:
{{declaring_type_name __value_type}} data() const { return _data; }
bool load(::luban::ByteBuf& _buf)
{
int n;
if (!_buf.readSize(n)) return false;
if (n != 1) return false;
{{deserialize '_buf' '_data' __value_type}}
return true;
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
{{declaring_type_name field.ctype}}& {{getter_name field.name}}() const { return _data->{{format_field_name __code_style field.name}}; }
{{~end~}}
{{~end~}}
};
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,23 @@
class {{__name}}
{
public:
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
{{make_cpp_name table.full_name}} {{table.name}};
{{~end~}}
bool load(::luban::Loader<::luban::ByteBuf> loader)
{
::luban::ByteBuf buf;
{{~for table in __tables~}}
buf.clear();
if (!loader(buf, "{{table.output_data_file}}")) return false;
if (!{{table.name}}.load(buf)) return false;
{{~end~}}
return true;
}
};
@@ -0,0 +1,148 @@
using Luban;
{{
parent_def_type = __bean.parent_def_type
export_fields = __bean.export_fields
hierarchy_export_fields = __bean.hierarchy_export_fields
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __bean.comment != '' ~}}
/// <summary>
/// {{escape_comment __bean.comment}}
/// </summary>
{{~end~}}
{{~
func get_ref_name
ret (format_property_name __code_style $0.name) + '_Ref'
end
func get_index_var_name
ret (format_property_name __code_style $0.name) + '_Index'
end
func generate_resolve_field_ref
field = $0
fieldName = format_property_name __code_style field.name
refTable = get_ref_table field
if can_generate_ref field
tableName = format_property_name __code_style refTable.name
if field.is_nullable
ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
else
ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
end
else if can_generate_collection_ref field
collection_ref_table = get_collection_ref_table field
tableName = format_property_name __code_style collection_ref_table.name
if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'array'
line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'map'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var (_k,_v) in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(_k, tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else
ret ''
end
else
if (is_field_bean_need_resolve_ref field)
ret fieldName + '?.ResolveRef(tables);'
else if (is_field_array_like_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
else
ret ''
end
end
end
~}}
{{~if __bean.is_value_type~}}
public partial struct {{__name}}
{{~else~}}
public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
{{~end~}}
{
public {{__name}}(ByteBuf _buf) {{if parent_def_type}} : base(_buf) {{end}}
{
{{~ for field in export_fields
fieldName = format_property_name __code_style field.name
~}}
{{deserialize '_buf' fieldName field.ctype}}
{{~if can_generate_ref field~}}
{{get_ref_name field}} = null;
{{~end~}}
{{~if has_index field~}}
foreach(var _v in {{fieldName}})
{
{{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
}
{{~end~}}
{{~end~}}
}
public static {{__name}} Deserialize{{__name}}(ByteBuf _buf)
{
{{~if __bean.is_abstract_type~}}
switch (_buf.ReadInt())
{
{{~for child in __bean.hierarchy_not_abstract_children~}}
case {{child.full_name}}.__ID__: return new {{child.full_name}}(_buf);
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
return new {{__bean.full_name}}(_buf);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
{{~if can_generate_ref field~}}
public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
{{~else if can_generate_collection_ref field~}}
public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
{{~end~}}
{{~if has_index field
indexMapType = get_index_map_type field
~}}
public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
{{~end~}}
{{~end~}}
{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
public const int __ID__ = {{__bean.id}};
public override int GetTypeId() => __ID__;
{{~end~}}
public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
{
{{~if parent_def_type~}}
base.ResolveRef(tables);
{{~end~}}
{{~for field in export_fields~}}
{{generate_resolve_field_ref field}}
{{~end~}}
}
public override string ToString()
{
return "{{full_name}}{ "
{{~for field in hierarchy_export_fields ~}}
+ "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
{{~end~}}
+ "}";
}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,163 @@
using Luban;
{{
key_type = __table.key_ttype
value_type = __table.value_ttype
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name value_type) + '>'
end
func table_key_list
varName = $0
indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
ret array.join indexList ', '
end
func table_param_def_list
paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
ret array.join paramList ', '
end
func table_param_name_list
paramList = __table.index_list |array.each do; ret $0.index_field.name; end
ret array.join paramList ', '
end
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __table.comment != '' ~}}
/// <summary>
/// {{escape_comment __table.comment}}
/// </summary>
{{~end~}}
public partial class {{__name}}
{
{{~if __table.is_map_table ~}}
private readonly System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> _dataMap;
private readonly System.Collections.Generic.List<{{declaring_type_name value_type}}> _dataList;
public {{__name}}(ByteBuf _buf)
{
_dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>();
_dataList = new System.Collections.Generic.List<{{declaring_type_name value_type}}>();
for(int n = _buf.ReadSize() ; n > 0 ; --n)
{
{{declaring_type_name value_type}} _v;
{{deserialize '_buf' '_v' value_type}}
_dataList.Add(_v);
_dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
}
}
public System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> DataMap => _dataMap;
public System.Collections.Generic.List<{{declaring_type_name value_type}}> DataList => _dataList;
{{~if value_type.is_dynamic~}}
public T GetOrDefaultAs<T>({{declaring_type_name key_type}} key) where T : {{declaring_type_name value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
public T GetAs<T>({{declaring_type_name key_type}} key) where T : {{declaring_type_name value_type}} => (T)_dataMap[key];
{{~end~}}
public {{declaring_type_name value_type}} GetOrDefault({{declaring_type_name key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
public {{declaring_type_name value_type}} Get({{declaring_type_name key_type}} key) => _dataMap[key];
public {{declaring_type_name value_type}} this[{{declaring_type_name key_type}} key] => _dataMap[key];
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else if __table.is_list_table ~}}
private readonly System.Collections.Generic.List<{{declaring_type_name value_type}}> _dataList;
{{~if __table.is_union_index~}}
private {{table_union_map_type_name}} _dataMapUnion;
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name value_type}}> _dataMap_{{idx.index_field.name}};
{{~end~}}
{{~end~}}
public {{__name}}(ByteBuf _buf)
{
_dataList = new System.Collections.Generic.List<{{declaring_type_name value_type}}>();
for(int n = _buf.ReadSize() ; n > 0 ; --n)
{
{{declaring_type_name value_type}} _v;
{{deserialize '_buf' '_v' value_type}}
_dataList.Add(_v);
}
{{~if __table.is_union_index~}}
_dataMapUnion = new {{table_union_map_type_name}}();
foreach(var _v in _dataList)
{
_dataMapUnion.Add(({{table_key_list "_v"}}), _v);
}
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name value_type}}>();
{{~end~}}
foreach(var _v in _dataList)
{
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
{{~end~}}
}
{{~end~}}
}
public System.Collections.Generic.List<{{declaring_type_name value_type}}> DataList => _dataList;
{{~if __table.is_union_index~}}
public {{declaring_type_name value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name value_type}} __v) ? __v : null;
{{~else if !__table.index_list.empty? ~}}
{{~for idx in __table.index_list~}}
public {{declaring_type_name value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name value_type}} __v) ? __v : null;
{{~end~}}
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else~}}
private readonly {{declaring_type_name value_type}} _data;
public {{declaring_type_name value_type}} Data => _data;
public {{__name}}(ByteBuf _buf)
{
int n = _buf.ReadSize();
if (n != 1) throw new SerializationException("table mode=one, but size != 1");
{{deserialize '_buf' '_data' value_type}}
}
{{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
_data.ResolveRef(tables);
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,31 @@
using Luban;
{{namespace_with_grace_begin __namespace}}
public partial class {{__name}}
{
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/// <summary>
/// {{escape_comment table.comment}}
/// </summary>
{{~end~}}
public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
{{~end~}}
public {{__name}}(System.Func<string, ByteBuf> loader)
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
{{~end~}}
ResolveRef();
}
private void ResolveRef()
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}}.ResolveRef(this);
{{~end~}}
}
}
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,149 @@
using Luban;
using System.Text.Json;
{{
parent_def_type = __bean.parent_def_type
export_fields = __bean.export_fields
hierarchy_export_fields = __bean.hierarchy_export_fields
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __bean.comment != '' ~}}
/// <summary>
/// {{escape_comment __bean.comment}}
/// </summary>
{{~end~}}
{{~
func get_ref_name
ret (format_property_name __code_style $0.name) + '_Ref'
end
func get_index_var_name
ret (format_property_name __code_style $0.name) + '_Index'
end
func generate_resolve_field_ref
field = $0
fieldName = format_property_name __code_style field.name
refTable = get_ref_table field
if can_generate_ref field
tableName = format_property_name __code_style refTable.name
if field.is_nullable
ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
else
ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
end
else if can_generate_collection_ref field
collection_ref_table = get_collection_ref_table field
tableName = format_property_name __code_style collection_ref_table.name
if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'array'
line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'map'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var (_k,_v) in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(_k, tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else
ret ''
end
else
if (is_field_bean_need_resolve_ref field)
ret fieldName + '?.ResolveRef(tables);'
else if (is_field_array_like_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
else
ret ''
end
end
end
~}}
{{~if __bean.is_value_type~}}
public partial struct {{__name}}
{{~else~}}
public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
{{~end~}}
{
public {{__name}}(JsonElement _buf) {{if parent_def_type}} : base(_buf) {{end}}
{
{{~ for field in export_fields
fieldName = format_property_name __code_style field.name
~}}
{{deserialize_field fieldName '_buf' field.name field.ctype}}
{{~if can_generate_ref field~}}
{{get_ref_name field}} = null;
{{~end~}}
{{~if has_index field~}}
foreach(var _v in {{fieldName}})
{
{{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
}
{{~end~}}
{{~end~}}
}
public static {{__name}} Deserialize{{__name}}(JsonElement _buf)
{
{{~if __bean.is_abstract_type~}}
switch (_buf.GetProperty("$type").GetString())
{
{{~for child in __bean.hierarchy_not_abstract_children~}}
case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
return new {{__bean.full_name}}(_buf);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
{{~if can_generate_ref field~}}
public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
{{~else if can_generate_collection_ref field~}}
public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
{{~end~}}
{{~if has_index field
indexMapType = get_index_map_type field
~}}
public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
{{~end~}}
{{~end~}}
{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
public const int __ID__ = {{__bean.id}};
public override int GetTypeId() => __ID__;
{{~end~}}
public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
{
{{~if parent_def_type~}}
base.ResolveRef(tables);
{{~end~}}
{{~for field in export_fields~}}
{{generate_resolve_field_ref field}}
{{~end~}}
}
public override string ToString()
{
return "{{full_name}}{ "
{{~for field in hierarchy_export_fields ~}}
+ "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
{{~end~}}
+ "}";
}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,162 @@
using Luban;
using System.Text.Json;
{{
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
end
func table_key_list
varName = $0
indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
ret array.join indexList ', '
end
func table_param_def_list
paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
ret array.join paramList ', '
end
func table_param_name_list
paramList = __table.index_list |array.each do; ret $0.index_field.name; end
ret array.join paramList ', '
end
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __table.comment != '' ~}}
/// <summary>
/// {{escape_comment __table.comment}}
/// </summary>
{{~end~}}
public partial class {{__name}}
{
{{~if __table.is_map_table ~}}
private readonly System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
public {{__name}}(JsonElement _buf)
{
_dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>();
_dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
foreach(JsonElement _ele in _buf.EnumerateArray())
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_v' '_ele' __value_type}}
_dataList.Add(_v);
_dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
}
}
public System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> DataMap => _dataMap;
public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
{{~if __value_type.is_dynamic~}}
public T GetOrDefaultAs<T>({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
public T GetAs<T>({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => (T)_dataMap[key];
{{~end~}}
public {{declaring_type_name __value_type}} GetOrDefault({{declaring_type_name __key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
public {{declaring_type_name __value_type}} Get({{declaring_type_name __key_type}} key) => _dataMap[key];
public {{declaring_type_name __value_type}} this[{{declaring_type_name __key_type}} key] => _dataMap[key];
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else if __table.is_list_table ~}}
private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
{{~if __table.is_union_index~}}
private {{table_union_map_type_name}} _dataMapUnion;
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
{{~end~}}
{{~end~}}
public {{__name}}(JsonElement _buf)
{
_dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
foreach(JsonElement _ele in _buf.EnumerateArray())
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_v' '_ele' __value_type}}
_dataList.Add(_v);
}
{{~if __table.is_union_index~}}
_dataMapUnion = new {{table_union_map_type_name}}();
foreach(var _v in _dataList)
{
_dataMapUnion.Add(({{table_key_list "_v"}}), _v);
}
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>();
{{~end~}}
foreach(var _v in _dataList)
{
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
{{~end~}}
}
{{~end~}}
}
public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
{{~if __table.is_union_index~}}
public {{declaring_type_name __value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name __value_type}} __v) ? __v : null;
{{~else if !__table.index_list.empty? ~}}
{{~for idx in __table.index_list~}}
public {{declaring_type_name __value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name __value_type}} __v) ? __v : null;
{{~end~}}
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else~}}
private readonly {{declaring_type_name __value_type}} _data;
public {{declaring_type_name __value_type}} Data => _data;
public {{__name}}(JsonElement _buf)
{
int n = _buf.GetArrayLength();
if (n != 1) throw new SerializationException("table mode=one, but size != 1");
{{deserialize '_data' '_buf[0]' __value_type}}
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
_data.ResolveRef(tables);
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,32 @@
using Luban;
using System.Text.Json;
{{namespace_with_grace_begin __namespace}}
public partial class {{__name}}
{
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/// <summary>
/// {{escape_comment table.comment}}
/// </summary>
{{~end~}}
public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
{{~end~}}
public {{__name}}(System.Func<string, JsonElement> loader)
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
{{~end~}}
ResolveRef();
}
private void ResolveRef()
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}}.ResolveRef(this);
{{~end~}}
}
}
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,102 @@
using System.Collections.Generic;
using SimpleJSON;
using Luban;
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __this.comment != '' ~}}
/// <summary>
/// {{escape_comment __this.comment}}
/// </summary>
{{~end~}}
public {{class_modifier __bean}} class {{__name}} : {{if __parent_def_type}} {{__this.parent}} {{else}} Luban.EditorBeanBase {{end}}
{
public {{__name}}()
{
{{~ for field in __fields ~}}
{{~if (need_init field.ctype) && !field.ctype.is_nullable ~}}
{{format_field_name __code_style field.name}} = {{init_value field.ctype}};
{{~end~}}
{{~end~}}
}
{{~if !__this.is_abstract_type~}}
public override void LoadJson(SimpleJSON.JSONObject _json)
{
{{~ for field in __hierarchy_fields ~}}
{
var _fieldJson = _json["{{field.name}}"];
if (_fieldJson != null)
{
{{deserialize '_fieldJson' (format_field_name __code_style field.name) field.ctype}}
}
}
{{~end~}}
}
public override void SaveJson(SimpleJSON.JSONObject _json)
{
{{~if parent~}}
_json["$type"] = "{{__this.full_name}}";
{{~end~}}
{{~ for field in __hierarchy_fields ~}}
{{~if field.ctype.is_nullable}}
if ({{format_field_name __code_style field.name}} != null)
{
{{serialize '_json' field.name (format_field_name __code_style field.name) field.ctype}}
}
{{~else~}}
{
{{~if (is_raw_nullable field.ctype)}}
if ({{format_field_name __code_style field.name}} == null) { throw new System.ArgumentNullException(); }
{{~end~}}
{{serialize '_json' field.name (format_field_name __code_style field.name) field.ctype}}
}
{{~end~}}
{{~end~}}
}
{{~end~}}
public static {{__name}} LoadJson{{__name}}(SimpleJSON.JSONNode _json)
{
{{~if __this.is_abstract_type~}}
string type = _json["$type"];
{{__name}} obj;
switch (type)
{
{{~for child in __this.hierarchy_not_abstract_children~}}
{{~if child.namespace == __this.namespace && __this.namespace != '' ~}}
case "{{child.full_name}}":
{{~end~}}
case "{{impl_data_type child __this}}":obj = new {{child.full_name}}(); break;
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
{{__name}} obj = new {{__this.full_name}}();
{{~end~}}
obj.LoadJson((SimpleJSON.JSONObject)_json);
return obj;
}
public static void SaveJson{{__name}}({{__name}} _obj, SimpleJSON.JSONNode _json)
{
{{~if __this.is_abstract_type~}}
_json["$type"] = _obj.GetType().Name;
{{~end~}}
_obj.SaveJson((SimpleJSON.JSONObject)_json);
}
{{~ for field in __fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,59 @@
{{~
comment = __enum.comment
items = __enum.items
itemType = 'Luban.EditorEnumItemInfo'
~}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if comment != '' ~}}
/// <summary>
/// {{escape_comment comment}}
/// </summary>
{{~end~}}
{{~if __enum.is_flags~}}
[System.Flags]
{{~end~}}
public enum {{__name}}
{
{{~ for item in items ~}}
{{~if item.comment != '' ~}}
/// <summary>
/// {{escape_comment item.comment_or_alias}}
/// </summary>
{{~end~}}
{{format_enum_item_name __code_style item.name}} = {{item.value}},
{{~end~}}
}
public static class {{__name}}_Metadata
{
{{~ for item in items ~}}
public static readonly {{itemType}} {{item.name}} = new {{itemType}}("{{item.name}}", "{{item.alias}}", {{item.int_value}}, "{{item.comment}}");
{{~end~}}
private static readonly System.Collections.Generic.List<{{itemType}}> __items = new System.Collections.Generic.List<{{itemType}}>
{
{{~ for item in items ~}}
{{item.name}},
{{~end~}}
};
public static System.Collections.Generic.List<{{itemType}}> GetItems() => __items;
public static {{itemType}} GetByName(string name)
{
return __items.Find(c => c.Name == name);
}
public static {{itemType}} GetByNameOrAlias(string name)
{
return __items.Find(c => c.Name == name || c.Alias == name);
}
public static {{itemType}} GetByValue(int value)
{
return __items.Find(c => c.Value == value);
}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,149 @@
using Luban;
using SimpleJSON;
{{
parent_def_type = __bean.parent_def_type
export_fields = __bean.export_fields
hierarchy_export_fields = __bean.hierarchy_export_fields
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __bean.comment != '' ~}}
/// <summary>
/// {{escape_comment __bean.comment}}
/// </summary>
{{~end~}}
{{~
func get_ref_name
ret (format_property_name __code_style $0.name) + '_Ref'
end
func get_index_var_name
ret (format_property_name __code_style $0.name) + '_Index'
end
func generate_resolve_field_ref
field = $0
fieldName = format_property_name __code_style field.name
refTable = get_ref_table field
if can_generate_ref field
tableName = format_property_name __code_style refTable.name
if field.is_nullable
ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
else
ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
end
else if can_generate_collection_ref field
collection_ref_table = get_collection_ref_table field
tableName = format_property_name __code_style collection_ref_table.name
if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'array'
line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'map'
line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'foreach (var (_k,_v) in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(_k, tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
ret line1 + line2
else
ret ''
end
else
if (is_field_bean_need_resolve_ref field)
ret fieldName + '?.ResolveRef(tables);'
else if (is_field_array_like_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
else
ret ''
end
end
end
~}}
{{~if __bean.is_value_type~}}
public partial struct {{__name}}
{{~else~}}
public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
{{~end~}}
{
public {{__name}}(JSONNode _buf) {{if parent_def_type}} : base(_buf) {{end}}
{
{{~ for field in export_fields
fieldName = format_property_name __code_style field.name
~}}
{{deserialize_field fieldName '_buf' field.name field.ctype}}
{{~if can_generate_ref field~}}
{{get_ref_name field}} = null;
{{~end~}}
{{~if has_index field~}}
foreach(var _v in {{fieldName}})
{
{{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
}
{{~end~}}
{{~end~}}
}
public static {{__name}} Deserialize{{__name}}(JSONNode _buf)
{
{{~if __bean.is_abstract_type~}}
switch ((string)_buf["$type"])
{
{{~for child in __bean.hierarchy_not_abstract_children~}}
case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
return new {{__bean.full_name}}(_buf);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
{{~if can_generate_ref field~}}
public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
{{~else if can_generate_collection_ref field~}}
public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
{{~end~}}
{{~if has_index field
indexMapType = get_index_map_type field
~}}
public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
{{~end~}}
{{~end~}}
{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
public const int __ID__ = {{__bean.id}};
public override int GetTypeId() => __ID__;
{{~end~}}
public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
{
{{~if parent_def_type~}}
base.ResolveRef(tables);
{{~end~}}
{{~for field in export_fields~}}
{{generate_resolve_field_ref field}}
{{~end~}}
}
public override string ToString()
{
return "{{full_name}}{ "
{{~for field in hierarchy_export_fields ~}}
+ "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
{{~end~}}
+ "}";
}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,162 @@
using Luban;
using SimpleJSON;
{{
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
end
func table_key_list
varName = $0
indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
ret array.join indexList ', '
end
func table_param_def_list
paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
ret array.join paramList ', '
end
func table_param_name_list
paramList = __table.index_list |array.each do; ret $0.index_field.name; end
ret array.join paramList ', '
end
}}
{{namespace_with_grace_begin __namespace_with_top_module}}
{{~if __table.comment != '' ~}}
/// <summary>
/// {{escape_comment __table.comment}}
/// </summary>
{{~end~}}
public partial class {{__name}}
{
{{~if __table.is_map_table ~}}
private readonly System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
public {{__name}}(JSONNode _buf)
{
_dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>();
_dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
foreach(JSONNode _ele in _buf.Children)
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_v' '_ele' __value_type}}
_dataList.Add(_v);
_dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
}
}
public System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> DataMap => _dataMap;
public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
{{~if __value_type.is_dynamic~}}
public T GetOrDefaultAs<T>({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
public T GetAs<T>({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => (T)_dataMap[key];
{{~end~}}
public {{declaring_type_name __value_type}} GetOrDefault({{declaring_type_name __key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
public {{declaring_type_name __value_type}} Get({{declaring_type_name __key_type}} key) => _dataMap[key];
public {{declaring_type_name __value_type}} this[{{declaring_type_name __key_type}} key] => _dataMap[key];
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else if __table.is_list_table ~}}
private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
{{~if __table.is_union_index~}}
private {{table_union_map_type_name}} _dataMapUnion;
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
{{~end~}}
{{~end~}}
public {{__name}}(JSONNode _buf)
{
_dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
foreach(JSONNode _ele in _buf.Children)
{
{{declaring_type_name __value_type}} _v;
{{deserialize '_v' '_ele' __value_type}}
_dataList.Add(_v);
}
{{~if __table.is_union_index~}}
_dataMapUnion = new {{table_union_map_type_name}}();
foreach(var _v in _dataList)
{
_dataMapUnion.Add(({{table_key_list "_v"}}), _v);
}
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>();
{{~end~}}
foreach(var _v in _dataList)
{
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
{{~end~}}
}
{{~end~}}
}
public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
{{~if __table.is_union_index~}}
public {{declaring_type_name __value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name __value_type}} __v) ? __v : null;
{{~else if !__table.index_list.empty? ~}}
{{~for idx in __table.index_list~}}
public {{declaring_type_name __value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name __value_type}} __v) ? __v : null;
{{~end~}}
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
}
{{~else~}}
private readonly {{declaring_type_name __value_type}} _data;
public {{declaring_type_name __value_type}} Data => _data;
public {{__name}}(JSONNode _buf)
{
int n = _buf.Count;
if (n != 1) throw new SerializationException("table mode=one, but size != 1");
{{deserialize '_data' '_buf[0]' __value_type}}
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
{{~end~}}
public void ResolveRef({{__manager_name}} tables)
{
_data.ResolveRef(tables);
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}
@@ -0,0 +1,32 @@
using Luban;
using SimpleJSON;
{{namespace_with_grace_begin __namespace}}
public partial class {{__name}}
{
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/// <summary>
/// {{escape_comment table.comment}}
/// </summary>
{{~end~}}
public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
{{~end~}}
public {{__name}}(System.Func<string, JSONNode> loader)
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
{{~end~}}
ResolveRef();
}
private void ResolveRef()
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}}.ResolveRef(this);
{{~end~}}
}
}
{{namespace_with_grace_end __namespace}}
@@ -0,0 +1,51 @@
namespace {{__namespace}};
{{~for enum in __enums
typeName = full_name enum
~}}
enum {{typeName}}:int {
{{~if !enum.has_zero_value_item~}}
__GENERATE_DEFAULT_VALUE = 0,
{{~end~}}
{{~for item in enum.items ~}}
{{typeName}}_{{item.name}} = {{item.int_value}},
{{~end~}}
}
{{~end~}}
{{~for bean in __beans~}}
{{~if bean.is_abstract_type ~}}
union {{full_name bean}} {
{{~for c in bean.hierarchy_not_abstract_children~}}
{{full_name c}},
{{~end~}}
}
{{~end~}}
{{~end~}}
{{~for bean in __beans~}}
{{~if !bean.is_abstract_type ~}}
table {{full_name bean}} {
{{~for f in bean.hierarchy_export_fields ~}}
{{f.name}}:{{declaring_type_name f.ctype}}{{type_metadata f.ctype}};
{{~end~}}
}
{{~end~}}
{{~end~}}
{{~for map in __maps~}}
table KeyValue_{{declaring_type_name map.key_type}}_{{declaring_type_name map.value_type}} {
key: {{declaring_type_name map.key_type}}{{type_metadata map.key_type}};
value: {{declaring_type_name map.value_type}}{{type_metadata map.value_type}};
}
{{~end~}}
{{~for table in __tables~}}
table {{full_name table}} {
// WARN! The name 'data_list' is used by FlatBuffersJsonExporter. don't modify it!
data_list:[{{declaring_type_name table.value_ttype}}](required);
}
root_type {{full_name table}};
{{~end~}}
@@ -0,0 +1,175 @@
@tool
class_name Schema
extends RefCounted
{{~for enum in __enums~}}
{{~if enum.comment != '' ~}}
## {{enum.comment | html.escape}}
{{~end~}}
enum {{full_name enum}}
{
{{~ for item in enum.items ~}}
{{~if item.comment_or_alias != '' ~}}
## {{item.comment_or_alias | html.escape}}
{{~end~}}
{{item.name}} = {{item.value}},
{{~end~}}
}
{{~end~}}
{{~for bean in __beans
name = (full_name bean)
~}}
{{~if bean.comment != '' ~}}
## {{bean.comment | html.escape}}
{{~end~}}
class {{name}}{{if bean.parent_def_type}} extends {{full_name bean.parent_def_type}}{{end}}:
{{~ for field in bean.export_fields ~}}
{{~if field.comment != '' ~}}
## {{field.comment | html.escape}}
{{~end~}}
var {{format_field_name __code_style field.name}}: {{declaring_type_name field.ctype}}
{{~end~}}
{{~if bean.is_abstract_type~}}
static func fromJson(_json_):
var type = _json_['$type']
match type:
{{~ for child in bean.hierarchy_not_abstract_children~}}
"{{impl_data_type child bean}}": return {{full_name child}}.new(_json_)
{{~end~}}
_: assert(false)
{{~end~}}
func _init(_json_) -> void:
{{~if bean.parent_def_type~}}
super(_json_)
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{deserialize_field ('self.' + (format_field_name __code_style field.name)) '_json_' field.name field.ctype}}
{{~end~}}
{{~if bean.export_fields.empty?~}}
pass
{{~end~}}
{{~end~}}
{{~for table in __tables
value_type = table.value_ttype
value_type_name = (declaring_type_name value_type)
~}}
{{~if table.comment != '' ~}}
## {{table.comment | html.escape}}
{{~end~}}
class {{full_name table}}:
{{~if table.is_map_table ~}}
var _data_list: Array[{{value_type_name}}]
var _data_map: Dictionary
func _init(_json_) -> void:
for _json2_ in _json_:
var _v: {{value_type_name}}
{{deserialize '_v' '_json2_' value_type}}
self._data_list.append(_v)
self._data_map[_v.{{format_field_name __code_style table.index_field.name}}] = _v
func get_data_list() -> Array[{{value_type_name}}]:
return self._data_list
func get_data_map() -> Dictionary:
return self._data_map
func get_item(key) -> {{value_type_name}}:
return self._data_map.get(key)
{{~else if table.multi_key ~}}
var _data_list: Array[{{value_type_name}}]
var _data_map: Dictionary
{{~ for INDEX in table.index_list ~}}
var _{{INDEX.index_field.name}}_data_map: Dictionary ## 以{{INDEX.index_field.name}}为key的数据字典
{{~ end ~}}
func _init(_json_) -> void:
{{~ for INDEX in table.index_list ~}}
self._{{INDEX.index_field.name}}_data_map = {}
{{~ end ~}}
for _json2_ in _json_:
var _v: {{value_type_name}}
{{deserialize '_v' '_json2_' value_type}}
self._data_list.append(_v)
self._data_map[_v.{{format_field_name __code_style table.index_field.name}}] = _v
{{~ for INDEX in table.index_list ~}}
self._{{INDEX.index_field.name}}_data_map[_v.{{INDEX.index_field.name}}] = _v
{{~ end ~}}
func get_data_list() -> Array[{{value_type_name}}]:
return self._data_list
func get_data_map() -> Dictionary:
return self._data_map
{{~ for INDEX in table.index_list ~}}
func get_{{INDEX.index_field.name}}_data_map() -> Dictionary:
return self._{{INDEX.index_field.name}}_data_map
{{~ end ~}}
func get_item(key) -> {{value_type_name}}:
return self._data_map.get(key)
{{~ for INDEX in table.index_list ~}}
func get_item_by_{{INDEX.index_field.name}}({{INDEX.index_field.name}}) -> {{value_type_name}}:
return self._{{INDEX.index_field.name}}_data_map.get({{INDEX.index_field.name}})
{{~ end ~}}
{{~else if table.is_list_table ~}}
var _data_list: Array[{{value_type_name}}] ## 数据数组
func _init(_json_) -> void:
for _json2_ in _json_:
var _v: {{value_type_name}}
{{deserialize '_v' '_json2_' value_type}}
self._data_list.append(_v)
func get_data_list() -> Array[{{value_type_name}}]:
return self._data_list
func get_item(index) -> {{value_type_name}}:
return self._data_list[index]
{{~else~}}
var _data:{{value_type_name}}
func _init(_json_) -> void:
assert(len(_json_) == 1, "table mode = one, but size != 1")
{{deserialize 'self._data' '_json_[0]' value_type}}
func get_data() -> {{value_type_name}}:
return self._data
{{~ for field in value_type.def_bean.hierarchy_export_fields
name = format_field_name __code_style field.name
~}}
{{~if field.comment != '' ~}}
## {{escape_comment field.comment}}
{{~end~}}
var {{name}}: {{declaring_type_name field.ctype}}:
get: return self._data.{{name}}
{{~end~}}
{{~end~}}
{{~end~}}
class {{str_full_name __full_name}}:
{{~for table in __tables ~}}
{{~if table.comment != ''~}}
## {{table.comment | html.escape}}
{{~end~}}
var {{format_method_name __code_style table.name}}: {{full_name table}}
{{~end~}}
func _init(loader: Callable) -> void:
{{~for table in __tables ~}}
self.{{format_method_name __code_style table.name}} = {{full_name table}}.new(loader.call('{{table.output_data_file}}'))
{{~end~}}
@@ -0,0 +1,54 @@
{{~if ___top_module != ''~}}
package {{__top_module}};
{{~end~}}
{{~
go_full_name = full_name __this
parent_def_type = __this.parent_def_type
is_abstract_type = __this.is_abstract_type
hierarchy_fields = __this.hierarchy_export_fields
hierarchy_not_abstract_children = __this.hierarchy_not_abstract_children
~}}
import (
"{{__luban_module_name}}"
)
{{collect_import __this}}
type {{go_full_name}} struct {
{{~for field in hierarchy_fields ~}}
{{format_field_name __code_style field.name}} {{declaring_type_name field.ctype}}
{{~end~}}
}
const TypeId_{{go_full_name}} = {{__this.id}}
func (*{{go_full_name}}) GetTypeId() int32 {
return {{__this.id}}
}
{{~if is_abstract_type~}}
func New{{go_full_name}}(_buf *luban.ByteBuf) (interface{}, error) {
var id int32
var err error
if id, err = _buf.ReadInt() ; err != nil {
return nil, err
}
switch id {
{{~for child in hierarchy_not_abstract_children~}}
case {{child.id}}: _v, err := New{{full_name child}}(_buf); if err != nil { return nil, errors.New("{{child.full_name|string.downcase}}") } else { return _v, nil }
{{~end~}}
default: return nil, errors.New("unknown type id")
}
}
{{~else~}}
func New{{go_full_name}}(_buf *luban.ByteBuf) (_v *{{go_full_name}}, err error) {
_v = &{{go_full_name}}{}
{{~for field in hierarchy_fields ~}}
{{deserialize_field field.ctype ("_v." + (format_field_name __code_style field.name)) '_buf' 'err'}}
{{~end~}}
return
}
{{~end~}}
@@ -0,0 +1,116 @@
{{~if ___top_module != ''~}}
package {{__top_module}};
{{~end~}}
{{~
go_full_name = full_name __this
key_type = __this.key_ttype
value_type = __this.value_ttype
index_field = __this.index_field
~}}
import "{{__luban_module_name}}"
{{~if __this.is_map_table~}}
type {{go_full_name}} struct {
_dataMap map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}}
_dataList []{{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
if size, err := _buf.ReadSize() ; err != nil {
return nil, err
} else {
_dataList := make([]{{declaring_type_name value_type}}, 0, size)
dataMap := make(map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}})
for i := 0 ; i < size ; i++ {
if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
return nil, err2
} else {
_dataList = append(_dataList, _v)
{{~if value_type.is_dynamic ~}}
{{~for child in value_type.def_bean.hierarchy_not_abstract_children~}}
if __v, __is := _v.(*{{full_name child}}) ; __is {
dataMap[__v.{{format_field_name __code_style index_field.name}}] = _v
continue
}
{{~end~}}
{{~else~}}
dataMap[_v.{{format_field_name __code_style index_field.name}}] = _v
{{~end~}}
}
}
return &{{go_full_name}}{_dataList:_dataList, _dataMap:dataMap}, nil
}
}
func (table *{{go_full_name}}) GetDataMap() map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}} {
return table._dataMap
}
func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
return table._dataList
}
func (table *{{go_full_name}}) Get(key {{declaring_type_name key_type}}) {{declaring_type_name value_type}} {
return table._dataMap[key]
}
{{~else if __this.is_list_table~}}
type {{go_full_name}} struct {
_dataList []{{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
if size, err := _buf.ReadSize() ; err != nil {
return nil, err
} else {
_dataList := make([]{{declaring_type_name value_type}}, 0, size)
for i := 0 ; i < size ; i++ {
if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
return nil, err2
} else {
_dataList = append(_dataList, _v)
}
}
return &{{go_full_name}}{_dataList:_dataList}, nil
}
}
func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
return table._dataList
}
func (table *{{go_full_name}}) Get(index int) {{declaring_type_name value_type}} {
return table._dataList[index]
}
{{~else~}}
import "errors"
type {{go_full_name}} struct {
_data {{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
if size, err := _buf.ReadSize() ; err != nil {
return nil, err
} else if size != 1 {
return nil, errors.New(" size != 1 ")
} else {
if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
return nil, err2
} else {
return &{{go_full_name}}{_data:_v}, nil
}
}
}
func (table *{{go_full_name}}) Get() {{declaring_type_name value_type}} {
return table._data
}
{{~end~}}
@@ -0,0 +1,33 @@
{{~if __namespace != ''~}}
package {{__namespace}};
{{~end~}}
import (
"{{__luban_module_name}}"
"errors"
)
type ByteBufLoader func(string) (*luban.ByteBuf, error)
type {{__name}} struct {
{{~for table in __tables ~}}
{{table.name}} *{{full_name table}}
{{~end~}}
}
func NewTables(loader ByteBufLoader) (*{{__name}}, error) {
var err error
var buf *luban.ByteBuf
tables := &{{__name}}{}
{{~for table in __tables ~}}
if buf, err = loader("{{table.output_data_file}}") ; err != nil {
return nil, err
}
if tables.{{table.name}}, err = New{{full_name table}}(buf) ; err != nil {
return nil, errors.Join(errors.New("failed to load {{table.name}}"), err)
}
{{~end~}}
return tables, nil
}
@@ -0,0 +1,50 @@
{{~if ___top_module != ''~}}
package {{__top_module}};
{{~end~}}
{{~
go_full_name = full_name __this
parent_def_type = __this.parent_def_type
is_abstract_type = __this.is_abstract_type
hierarchy_fields = __this.hierarchy_export_fields
hierarchy_not_abstract_children = __this.hierarchy_not_abstract_children
~}}
{{collect_import __this}}
type {{go_full_name}} struct {
{{~for field in hierarchy_fields ~}}
{{format_field_name __code_style field.name}} {{declaring_type_name field.ctype}}
{{~end~}}
}
const TypeId_{{go_full_name}} = {{__this.id}}
func (*{{go_full_name}}) GetTypeId() int32 {
return {{__this.id}}
}
{{~if is_abstract_type~}}
func New{{go_full_name}}(_buf map[string]interface{}) (interface{}, error) {
var id string
var _ok_ bool
if id, _ok_ = _buf["$type"].(string) ; !_ok_ {
return nil, errors.New("type id missing")
}
switch id {
{{~for child in hierarchy_not_abstract_children~}}
case "{{impl_data_type child __this}}": _v, err := New{{full_name child}}(_buf); if err != nil { return nil, errors.New("{{full_name child|string.downcase}}") } else { return _v, nil }
{{~end~}}
default: return nil, errors.New("unknown type id")
}
}
{{~else~}}
func New{{go_full_name}}(_buf map[string]interface{}) (_v *{{go_full_name}}, err error) {
_v = &{{go_full_name}}{}
{{~for field in hierarchy_fields ~}}
{{deserialize_field field.ctype ("_v." + (format_field_name __code_style field.name)) field.name '_buf'}}
{{~end~}}
return
}
{{~end~}}
@@ -0,0 +1,103 @@
{{~if ___top_module != ''~}}
package {{__top_module}};
{{~end~}}
{{~
go_full_name = full_name __this
key_type = __this.key_ttype
value_type = __this.value_ttype
index_field = __this.index_field
~}}
{{~if __this.is_map_table~}}
type {{go_full_name}} struct {
_dataMap map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}}
_dataList []{{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
_dataList := make([]{{declaring_type_name value_type}}, 0, len(_buf))
dataMap := make(map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}})
for _, _ele_ := range _buf {
if _v, err2 := New{{full_name value_type.def_bean}}(_ele_); err2 != nil {
return nil, err2
} else {
_dataList = append(_dataList, _v)
{{~if value_type.is_dynamic ~}}
{{~for child in value_type.def_bean.hierarchy_not_abstract_children~}}
if __v, __is := _v.(*{{full_name child}}) ; __is {
dataMap[__v.{{format_field_name __code_style index_field.name}}] = _v
continue
}
{{~end~}}
{{~else~}}
dataMap[_v.{{format_field_name __code_style index_field.name}}] = _v
{{~end~}}
}
}
return &{{go_full_name}}{_dataList:_dataList, _dataMap:dataMap}, nil
}
func (table *{{go_full_name}}) GetDataMap() map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}} {
return table._dataMap
}
func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
return table._dataList
}
func (table *{{go_full_name}}) Get(key {{declaring_type_name key_type}}) {{declaring_type_name value_type}} {
return table._dataMap[key]
}
{{~else if __this.is_list_table~}}
type {{go_full_name}} struct {
_dataList []{{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
_dataList := make([]{{declaring_type_name value_type}}, 0, len(_buf))
for _, _ele_ := range _buf {
if _v, err2 := New{{full_name value_type.def_bean}}(_ele_); err2 != nil {
return nil, err2
} else {
_dataList = append(_dataList, _v)
}
}
return &{{go_full_name}}{_dataList:_dataList}, nil
}
func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
return table._dataList
}
func (table *{{go_full_name}}) Get(index int) {{declaring_type_name value_type}} {
return table._dataList[index]
}
{{~else~}}
import "errors"
type {{go_full_name}} struct {
_data {{declaring_type_name value_type}}
}
func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
if len(_buf) != 1 {
return nil, errors.New(" size != 1 ")
} else {
if _v, err2 := New{{full_name value_type.def_bean}}(_buf[0]); err2 != nil {
return nil, err2
} else {
return &{{go_full_name}}{_data:_v}, nil
}
}
}
func (table *{{go_full_name}}) Get() {{declaring_type_name value_type}} {
return table._data
}
{{~end~}}
@@ -0,0 +1,28 @@
{{~if __namespace != ''~}}
package {{__namespace}};
{{~end~}}
type JsonLoader func(string) ([]map[string]interface{}, error)
type {{__name}} struct {
{{~for table in __tables ~}}
{{table.name}} *{{full_name table}}
{{~end~}}
}
func NewTables(loader JsonLoader) (*{{__name}}, error) {
var err error
var buf []map[string]interface{}
tables := &{{__name}}{}
{{~for table in __tables ~}}
if buf, err = loader("{{table.output_data_file}}") ; err != nil {
return nil, err
}
if tables.{{table.name}}, err = New{{full_name table}}(buf) ; err != nil {
return nil, err
}
{{~end~}}
return tables, nil
}
@@ -0,0 +1,65 @@
{{~if __namespace_with_top_module != ''~}}
package {{__namespace_with_top_module}};
{{~end~}}
import luban.*;
{{~
parent_def_type = __this.parent_def_type
export_fields = __this.export_fields
hierarchy_export_fields = __this.hierarchy_export_fields
~}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
public {{class_modifier __this}} class {{__name}} extends {{if parent_def_type}}{{__this.parent_def_type.full_name_with_top_module}}{{else}}AbstractBean{{end}} {
public {{__name}}(ByteBuf _buf) {
{{~if parent_def_type~}}
super(_buf);
{{~end~}}
{{~ for field in export_fields ~}}
{{deserialize '_buf' (format_field_name __code_style field.name) field.ctype}}
{{~end~}}
}
public static {{__name}} deserialize(ByteBuf _buf) {
{{~if __this.is_abstract_type~}}
switch (_buf.readInt()) {
{{~for child in __this.hierarchy_not_abstract_children~}}
case {{child.full_name_with_top_module}}.__ID__: return new {{child.full_name_with_top_module}}(_buf);
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
return new {{__this.full_name_with_top_module}}(_buf);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
public final {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
{{~end~}}
{{~if !__this.is_abstract_type~}}
public static final int __ID__ = {{__this.id}};
@Override
public int getTypeId() { return __ID__; }
{{~end~}}
@Override
public String toString() {
return "{{full_name}}{ "
{{~for field in hierarchy_export_fields ~}}
+ "(format_field_name __code_style field.name):" + {{format_field_name __code_style field.name}} + ","
{{~end~}}
+ "}";
}
}
@@ -0,0 +1,81 @@
{{~if __namespace_with_top_module != ''~}}
package {{__namespace_with_top_module}};
{{~end~}}
import luban.*;
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
public final class {{__name}} {
{{~if __this.is_map_table
key_type = __this.key_ttype
~}}
private final java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> _dataMap;
private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
public {{__name}}(ByteBuf _buf) {
_dataMap = new java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}>();
_dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
for(int n = _buf.readSize() ; n > 0 ; --n) {
{{declaring_box_type_name __value_type}} _v;
{{deserialize '_buf' '_v' __value_type}}
_dataList.add(_v);
_dataMap.put(_v.{{format_field_name __code_style __this.index_field.name}}, _v);
}
}
public java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> getDataMap() { return _dataMap; }
public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
{{~if __value_type.is_dynamic~}}
@SuppressWarnings("unchecked")
public <T extends {{declaring_box_type_name __value_type}}> T getAs({{declaring_type_name key_type}} key) { return (T)_dataMap.get(key); }
{{~end~}}
public {{declaring_box_type_name __value_type}} get({{declaring_type_name key_type}} key) { return _dataMap.get(key); }
{{~else if __this.is_list_table ~}}
private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
public {{__name}}(ByteBuf _buf) {
_dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
for(int n = _buf.readSize() ; n > 0 ; --n) {
{{declaring_box_type_name __value_type}} _v;
{{deserialize '_buf' '_v' __value_type}}
_dataList.add(_v);
}
}
public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
public {{declaring_box_type_name __value_type}} get(int index) { return _dataList.get(index); }
{{~else~}}
private final {{declaring_type_name __value_type}} _data;
public final {{declaring_type_name __value_type}} data() { return _data; }
public {{__name}}(ByteBuf _buf) {
int n = _buf.readSize();
if (n != 1) throw new SerializationException("table mode=one, but size != 1");
{{deserialize '_buf' '_data' __value_type}}
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
public {{declaring_type_name field.ctype}} {{getter_name field.name}}() { return _data.{{format_field_name __code_style field.name}}; }
{{~end~}}
{{~end~}}
}
@@ -0,0 +1,37 @@
{{~if __namespace != ''~}}
package {{__namespace}};
{{~end~}}
import luban.*;
{{~
func get_table_inner_name
ret '_' + ($0 | string.downcase)
end
~}}
public final class {{__name}}
{
public static interface IByteBufLoader {
ByteBuf load(String file) throws java.io.IOException;
}
{{~for table in __tables
inner_name = get_table_inner_name table.name
~}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
private final {{table.full_name_with_top_module}} {{inner_name}};
public {{table.full_name_with_top_module}} get{{table.name}}() { return {{inner_name}}; }
{{~end~}}
public {{__name}}(IByteBufLoader loader) throws java.io.IOException {
{{~for table in __tables
inner_name = get_table_inner_name table.name
~}}
{{inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}"));
{{~end~}}
}
}
@@ -0,0 +1,67 @@
{{~if __namespace_with_top_module != ''~}}
package {{__namespace_with_top_module}};
{{~end~}}
import luban.*;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
{{~
parent_def_type = __this.parent_def_type
export_fields = __this.export_fields
hierarchy_export_fields = __this.hierarchy_export_fields
~}}
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
public {{class_modifier __this}} class {{__name}} extends {{if parent_def_type}}{{__this.parent_def_type.full_name_with_top_module}}{{else}}AbstractBean{{end}} {
public {{__name}}(JsonObject _buf) {
{{~if parent_def_type~}}
super(_buf);
{{~end~}}
{{~ for field in export_fields ~}}
{{deserialize_field (format_field_name __code_style field.name) '_buf' field.name field.ctype}}
{{~end~}}
}
public static {{__name}} deserialize(JsonObject _buf) {
{{~if __this.is_abstract_type~}}
switch (_buf.get("$type").getAsString()) {
{{~for child in __this.hierarchy_not_abstract_children~}}
case "{{impl_data_type child __this}}": return new {{child.full_name_with_top_module}}(_buf);
{{~end~}}
default: throw new SerializationException();
}
{{~else~}}
return new {{__this.full_name_with_top_module}}(_buf);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
public final {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
{{~end~}}
{{~if !__this.is_abstract_type~}}
public static final int __ID__ = {{__this.id}};
@Override
public int getTypeId() { return __ID__; }
{{~end~}}
@Override
public String toString() {
return "{{full_name}}{ "
{{~for field in hierarchy_export_fields ~}}
+ "(format_field_name __code_style field.name):" + {{format_field_name __code_style field.name}} + ","
{{~end~}}
+ "}";
}
}
@@ -0,0 +1,82 @@
{{~if __namespace_with_top_module != ''~}}
package {{__namespace_with_top_module}};
{{~end~}}
import luban.*;
import com.google.gson.JsonElement;
{{~if __this.comment != '' ~}}
/**
* {{escape_comment __this.comment}}
*/
{{~end~}}
public final class {{__name}} {
{{~if __this.is_map_table
key_type = __this.key_ttype
~}}
private final java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> _dataMap;
private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
public {{__name}}(JsonElement _buf) {
_dataMap = new java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}>();
_dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
for (com.google.gson.JsonElement _e_ : _buf.getAsJsonArray()) {
{{declaring_box_type_name __value_type}} _v;
{{deserialize '_v' '_e_' __value_type}}
_dataList.add(_v);
_dataMap.put(_v.{{format_field_name __code_style __this.index_field.name}}, _v);
}
}
public java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> getDataMap() { return _dataMap; }
public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
{{~if __value_type.is_dynamic~}}
@SuppressWarnings("unchecked")
public <T extends {{declaring_box_type_name __value_type}}> T getAs({{declaring_type_name key_type}} key) { return (T)_dataMap.get(key); }
{{~end~}}
public {{declaring_box_type_name __value_type}} get({{declaring_type_name key_type}} key) { return _dataMap.get(key); }
{{~else if __this.is_list_table ~}}
private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
public {{__name}}(JsonElement _buf) {
_dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
for (com.google.gson.JsonElement _e_ : _buf.getAsJsonArray()) {
{{declaring_box_type_name __value_type}} _v;
{{deserialize '_v' '_e_' __value_type}}
_dataList.add(_v);
}
}
public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
public {{declaring_box_type_name __value_type}} get(int index) { return _dataList.get(index); }
{{~else~}}
private final {{declaring_type_name __value_type}} _data;
public final {{declaring_type_name __value_type}} data() { return _data; }
public {{__name}}(JsonElement _buf) {
int n = _buf.getAsJsonArray().size();
if (n != 1) throw new SerializationException("table mode=one, but size != 1");
{{deserialize '_data' '_buf.getAsJsonArray().get(0).getAsJsonObject()' __value_type}}
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
public {{declaring_type_name field.ctype}} {{getter_name field.name}}() { return _data.{{format_field_name __code_style field.name}}; }
{{~end~}}
{{~end~}}
}
@@ -0,0 +1,39 @@
{{~if __namespace != ''~}}
package {{__namespace}};
{{~end~}}
import luban.*;
import com.google.gson.JsonElement;
{{~
func get_table_inner_name
ret '_' + ($0 | string.downcase)
end
~}}
public final class {{__name}}
{
public interface IJsonLoader {
JsonElement load(String file) throws java.io.IOException;
}
{{~for table in __tables
inner_name = get_table_inner_name table.name
~}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
private final {{table.full_name_with_top_module}} {{inner_name}};
public {{table.full_name_with_top_module}} get{{table.name}}() { return {{inner_name}}; }
{{~end~}}
public {{__name}}(IJsonLoader loader) throws java.io.IOException {
{{~for table in __tables
inner_name = get_table_inner_name table.name
~}}
{{inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}"));
{{~end~}}
}
}
@@ -0,0 +1,158 @@
local setmetatable = setmetatable
local pairs = pairs
local ipairs = ipairs
local tinsert = table.insert
local function SimpleClass()
local class = {}
class.__index = class
class.New = function(...)
local ctor = class.ctor
local o = ctor and ctor(...) or {}
setmetatable(o, class)
return o
end
return class
end
local function get_map_size(m)
local n = 0
for _ in pairs(m) do
n = n + 1
end
return n
end
local enums =
{
{{~ for c in __enums ~}}
---@class {{c.full_name}} {{-if c.comment != ''}} @{{escape_comment c.comment}}{{end}}
{{~ for item in c.items ~}}
---@field public {{item.name}} integer {{-if item.comment != ''}} @{{escape_comment item.comment}}{{end}}
{{~end~}}
['{{c.full_name}}'] = { {{ for item in c.items }} {{item.name}}={{item.int_value}}, {{end}} };
{{~end~}}
}
local tables =
{
{{~for table in __tables ~}}
{{~if table.is_map_table ~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
{{~else if table.is_list_table ~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='list', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
{{~else~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.def_bean.full_name}}'},
{{~end~}}
{{~end~}}
}
local function InitTypes(methods)
local readBool = methods.readBool
local readByte = methods.readByte
local readShort = methods.readShort
local readFshort = methods.readFshort
local readInt = methods.readInt
local readFint = methods.readFint
local readLong = methods.readLong
local readFlong = methods.readFlong
local readFloat = methods.readFloat
local readDouble = methods.readDouble
local readSize = methods.readSize
local readString = methods.readString
local function readList(bs, keyFun)
local list = {}
local v
for i = 1, readSize(bs) do
tinsert(list, keyFun(bs))
end
return list
end
local readArray = readList
local function readSet(bs, keyFun)
local set = {}
local v
for i = 1, readSize(bs) do
tinsert(set, keyFun(bs))
end
return set
end
local function readMap(bs, keyFun, valueFun)
local map = {}
for i = 1, readSize(bs) do
local k = keyFun(bs)
local v = valueFun(bs)
map[k] = v
end
return map
end
local function readNullableBool(bs)
if readBool(bs) then
return readBool(bs)
end
end
local beans = {}
{{~ for bean in __beans ~}}
do
---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}} {{-if bean.comment != ''}} @{{escape_comment bean.comment}}{{end}}
{{~ for field in bean.export_fields~}}
---@field public {{field.name}} {{comment_type field.ctype}} {{-if field.comment != ''}} @{{escape_comment field.comment}}{{end}}
{{~end~}}
local class = {
{{~ for field in bean.export_fields~}}
{ name='{{field.name}}', type='{{comment_type field.ctype}}'},
{{~end~}}
}
beans['{{bean.full_name}}'] = class
end
{{~end~}}
local beans = {}
{{~ for bean in __beans ~}}
do
---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}}
{{~ for field in bean.export_fields~}}
---@field public {{field.name}} {{comment_type field.ctype}}
{{~end~}}
local class = SimpleClass()
class._id = {{bean.id}}
class._type_ = '{{bean.full_name}}'
local id2name = { {{for c in bean.hierarchy_not_abstract_children}} [{{c.id}}] = '{{c.full_name}}', {{end}} }
{{~if bean.is_abstract_type~}}
class._deserialize = function(bs)
local id = readInt(bs)
return beans[id2name[id]]._deserialize(bs)
end
{{~else~}}
class._deserialize = function(bs)
local o = {
{{~ for field in bean.hierarchy_export_fields ~}}
{{~if !(need_marshal_bool_prefix field.ctype)~}}
{{field.name}} = {{deserialize 'bs' field.ctype}},
{{~else~}}
{{field.name}} = {{if !field.ctype.is_bool}}readBool(bs) and {{deserialize 'bs' field.ctype}} or nil {{-else-}} readNullableBool(bs) {{-end-}},
{{~end~}}
{{~end~}}
}
setmetatable(o, class)
return o
end
{{~end~}}
beans[class._type_] = class
end
{{~end~}}
return { enums = enums, beans = beans, tables = tables }
end
return { InitTypes = InitTypes }
@@ -0,0 +1,42 @@
local enums =
{
{{~ for c in __enums ~}}
---@class {{c.full_name}} {{-if c.comment != ''}} @{{escape_comment c.comment}}{{end}}
{{~ for item in c.items ~}}
---@field public {{item.name}} integer {{-if item.comment != ''}} @{{escape_comment item.comment}}{{end}}
{{~end~}}
['{{c.full_name}}'] = { {{ for item in c.items }} {{item.name}}={{item.int_value}}, {{end}} };
{{~end~}}
}
local beans = {}
{{~ for bean in __beans ~}}
do
---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}} {{-if bean.comment != ''}} @{{escape_comment bean.comment}}{{end}}
{{~ for field in bean.export_fields~}}
---@field public {{field.name}} {{comment_type field.ctype}} {{-if field.comment != ''}} @{{escape_comment field.comment}}{{end}}
{{~end~}}
local class = {
{{~ for field in bean.export_fields~}}
{ name='{{field.name}}', type='{{comment_type field.ctype}}'},
{{~end~}}
}
beans['{{bean.full_name}}'] = class
end
{{~end~}}
local tables =
{
{{~for table in __tables ~}}
{{~if table.is_map_table ~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
{{~else if table.is_list_table ~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='list', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
{{~else~}}
{ name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.def_bean.full_name}}'},
{{~end~}}
{{~end~}}
}
return { enums = enums, beans = beans, tables = tables }
@@ -0,0 +1,41 @@
syntax = "{{__syntax}}";
package {{__namespace}};
{{~for enum in __enums
typeName = full_name enum
~}}
enum {{typeName}} {
{{~if !enum.has_zero_value_item ~}}
{{typeName}}_EMPTY_PLACEHOLDER = 0;
{{~end~}}
{{~for item in enum.items ~}}
{{typeName}}_{{item.name}} = {{item.int_value}};
{{~end~}}
}
{{~end~}}
{{~for bean in __beans
typeName = full_name bean
~}}
message {{typeName}} {
{{~if bean.is_abstract_type ~}}
oneof value {
{{~for c in bean.hierarchy_not_abstract_children~}}
{{full_name c}} {{c.name}} = {{c.auto_id}};
{{~end~}}
}
{{~else~}}
{{~for f in bean.hierarchy_export_fields ~}}
{{pre_decorator f.ctype}} {{declaring_type_name f.ctype}} {{f.name}} = {{f.auto_id}} {{suffix_options f.ctype}};
{{~end~}}
{{~end~}}
}
{{~end~}}
{{~for table in __tables~}}
message {{full_name table}} {
repeated {{declaring_type_name table.value_ttype}} data_list = 1 [packed = false];
}
{{~end~}}
@@ -0,0 +1,118 @@
from enum import Enum
{{~for enum in __enums~}}
{{~if enum.comment != '' ~}}
'''
{{enum.comment | html.escape}}
'''
{{~end~}}
class {{full_name enum}}(Enum):
{{~ for item in enum.items ~}}
{{~if item.comment_or_alias != '' ~}}
'''
{{item.comment_or_alias | html.escape}}
'''
{{~end~}}
{{item.name}} = {{item.value}}
{{~end~}}
{{~if enum.items.empty?~}}
pass
{{~end~}}
{{~end~}}
{{~for bean in __beans
name = (full_name bean)
~}}
class {{name}} {{if bean.parent_def_type}}({{full_name bean.parent_def_type}}){{end}}:
{{~if bean.is_abstract_type~}}
_childrenTypes = None
@staticmethod
def fromJson(_json_):
childrenTypes = {{name}}._childrenTypes
if not childrenTypes:
childrenTypes = {{name}}._childrenTypes = {
{{~ for child in bean.hierarchy_not_abstract_children~}}
'{{impl_data_type child bean}}': {{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 bean.parent_def_type~}}
{{full_name bean.parent_def_type}}.__init__(self, _json_)
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{deserialize_field ('self.' + (format_field_name __code_style field.name)) '_json_' field.name field.ctype}}
{{~end~}}
{{~if bean.export_fields.empty?}}
pass
{{~end~}}
{{~end~}}
{{~for table in __tables
value_type = table.value_ttype
~}}
class {{full_name table}}:
{{~if table.is_map_table ~}}
def __init__(self, _json_ ):
self._dataMap = {}
self._dataList = []
for _json2_ in _json_:
{{deserialize '_v' '_json2_' value_type}}
self._dataList.append(_v)
self._dataMap[_v.{{format_field_name __code_style table.index_field.name}}] = _v
def getDataMap(self) : return self._dataMap
def getDataList(self) : return self._dataList
def get(self, key) : return self._dataMap.get(key)
{{~else if table.is_list_table ~}}
def __init__(self, _json_ ):
self._dataList = []
for _json2_ in _json_:
{{deserialize '_v' '_json2_' value_type}}
self._dataList.append(_v)
def getDataList(self) : return self._dataList
def get(self, index) : return self._dataList[index]
{{~else~}}
def __init__(self, _json_):
if (len(_json_) != 1): raise Exception('table mode=one, but size != 1')
{{deserialize 'self._data' '_json_[0]' value_type}}
def getData(self) : return self._data
{{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != ''
name = format_field_name __code_style field.name
~}}
'''
{{escape_comment field.comment}}
'''
{{~end~}}
def {{name}}(self) : return self._data.{{name}}
{{~end~}}
{{~end~}}
{{~end~}}
class {{str_full_name __full_name}}:
def __init__(self, loader):
{{~for table in __tables ~}}
self.{{format_method_name __code_style table.name}} = {{full_name table}}(loader('{{table.output_data_file}}'));
{{~end~}}
@@ -0,0 +1,231 @@
{{~for enum in __enums~}}
{{namespace_with_grace_begin enum.namespace}}
{{~if enum.comment != '' ~}}
/**
* {{enum.comment | html.escape}}
*/
{{~end~}}
export enum {{enum.name}} {
{{~for item in enum.items ~}}
{{~if item.comment != '' ~}}
/**
* {{escape_comment item.comment}}
*/
{{~end~}}
{{item.name}} = {{item.value}},
{{~end~}}
}
{{namespace_with_grace_end enum.namespace}}
{{~end~}}
{{~
func get_ref_name
ret (format_property_name __code_style $0.name) + '_ref'
end
func generate_resolve_field_ref
field = $0
fieldName = format_property_name __code_style field.name
refTable = get_ref_table field
if can_generate_ref field
tableName = refTable.name
if field.is_nullable
ret 'this.'+(get_ref_name field) + ' = this.' + fieldName + '!= null ? tables.' + tableName + '.get(this.' + fieldName + ') : null'
else
ret 'this.'+(get_ref_name field) + ' = tables.' + tableName + '.get(this.' + fieldName + ')'
end
else
if (is_field_bean_need_resolve_ref field)
ret 'this.'+fieldName + '?.resolve(tables);'
else if (is_field_array_like_need_resolve_ref field)
ret 'for (let _e of ' + fieldName + ') { _e?.resolve(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'foreach (var [_, _e] of ' + fieldName ') { _e?.resolve(tables); }'
else
ret ''
end
end
end
~}}
{{~for bean in __beans~}}
{{namespace_with_grace_begin bean.namespace}}
{{~if bean.comment != '' ~}}
/**
* {{escape_comment bean.comment}}
*/
{{~end~}}
export {{if bean.is_abstract_type}}abstract {{end}}class {{bean.name}}{{if bean.parent_def_type}} extends {{bean.parent_def_type.full_name}}{{end}} {
{{~if bean.is_abstract_type~}}
static constructorFrom(_json_: any): {{bean.name}}{
switch (_json_["$type"]) {
{{~ for child in bean.hierarchy_not_abstract_children~}}
case '{{impl_data_type child bean}}': return new {{child.full_name}}(_json_)
{{~end~}}
default: throw new Error()
}
}
{{~end~}}
constructor(_json_: any) {
{{~if bean.parent_def_type~}}
super(_json_)
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{~if !field.ctype.is_nullable~}}
if (_json_.{{field.name}} === undefined) { throw new Error() }
{{~end~}}
{{deserialize ('this.' + format_field_name __code_style field.name) ( '_json_.' + field.name) field.ctype}}
{{~end~}}
}
{{~ for field in bean.export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
readonly {{format_field_name __code_style field.name}}: {{declaring_type_name field.ctype}}
{{~if can_generate_ref field~}}
{{get_ref_name field}}: {{declaring_type_name (get_ref_type field)}} | undefined
{{~end~}}
{{~end~}}
resolve(tables:{{__name}})
{
{{~if bean.parent_def_type~}}
super.resolve(tables)
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{~if can_generate_ref field~}}
{{generate_resolve_field_ref field}}
{{~end~}}
{{~end~}}
}
}
{{namespace_with_grace_end bean.namespace}}
{{~end~}}
{{~for table in __tables
key_type = table.key_ttype
value_type = table.value_ttype
~}}
{{namespace_with_grace_begin table.namespace}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
export class {{table.name}}{
{{~if table.is_map_table ~}}
private _dataMap: Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>
private _dataList: {{declaring_type_name value_type}}[]
constructor(_json_: any) {
this._dataMap = new Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>()
this._dataList = []
for(var _json2_ of _json_) {
let _v: {{declaring_type_name value_type}}
{{deserialize '_v' '_json2_' value_type}}
this._dataList.push(_v)
this._dataMap.set(_v.{{format_field_name __code_style table.index_field.name}}, _v)
}
}
getDataMap(): Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> { return this._dataMap; }
getDataList(): {{declaring_type_name value_type}}[] { return this._dataList; }
get(key: {{declaring_type_name key_type}}): {{declaring_type_name value_type}} | undefined { return this._dataMap.get(key); }
resolve(tables:{{__name}})
{
for(let data of this._dataList)
{
data.resolve(tables)
}
}
{{~else if table.is_list_table ~}}
private _dataList: {{declaring_type_name value_type}}[]
constructor(_json_: any) {
this._dataList = []
for(var _json2_ of _json_) {
let _v: {{declaring_type_name value_type}}
{{deserialize '_v' '_json2_' value_type}}
this._dataList.push(_v)
}
}
getDataList(): {{declaring_type_name value_type}}[] { return this._dataList }
get(index: number): {{declaring_type_name value_type}} | undefined { return this._dataList[index] }
resolve(tables:{{__name}})
{
for(let data of this._dataList)
{
data.resolve(tables)
}
}
{{~else~}}
private _data: {{declaring_type_name value_type}}
constructor(_json_: any) {
if (_json_.length != 1) throw new Error('table mode=one, but size != 1')
{{deserialize 'this._data' '_json_[0]' value_type}}
}
getData(): {{declaring_type_name value_type}} { return this._data; }
{{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
get {{format_field_name __code_style field.name}}(): {{declaring_type_name field.ctype}} { return this._data.{{format_field_name __code_style field.name}}; }
{{~if can_generate_ref field~}}
get {{format_field_name __code_style field.name}}_ref(): {{declaring_type_name (get_ref_type field)}} | undefined { return this._data.{{format_field_name __code_style field.name}}_ref; }
{{~end~}}
{{~end~}}
resolve(tables:{{__name}})
{
this._data.resolve(tables)
}
{{end}}
}
{{namespace_with_grace_end table.namespace}}
{{~end~}}
type JsonLoader = (file: string) => any
export class {{__name}} {
{{~ for table in __tables ~}}
private _{{table.name}}: {{table.full_name}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
get {{table.name}}(): {{table.full_name}} { return this._{{table.name}};}
{{~end~}}
constructor(loader: JsonLoader) {
{{~for table in __tables ~}}
this._{{table.name}} = new {{table.full_name}}(loader('{{table.output_data_file}}'))
{{~end~}}
{{~for table in __tables ~}}
this._{{table.name}}.resolve(this)
{{~end~}}
}
}