init
This commit is contained in:
@@ -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~}}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user