From 85937685b6e79dcb49976f9eec3975186c256bfc Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 1 Dec 2021 14:12:11 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9Ecfg=20=E6=89=80=E6=9C=89=E8=AF=AD=E8=A8=80=E5=AF=B9tab?= =?UTF-8?q?le=20mode=3Dlist=E7=9A=84=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 ++++++++++++++++++- .../Source/DataExporters/LuaExportor.cs | 13 ++++ src/Luban.Job.Cfg/Source/Defs/DefField.cs | 2 +- src/Luban.Job.Cfg/Source/Defs/DefTable.cs | 4 +- .../Source/Utils/DataExporterUtil.cs | 5 ++ .../Source/Validators/RefValidator.cs | 22 +++++-- .../Templates/config/cpp_bin/table.tpl | 37 +++++++++++ .../Templates/config/cs_bin/table.tpl | 33 ++++++++++ .../Templates/config/cs_json/table.tpl | 34 +++++++++++ .../Templates/config/cs_unity_json/table.tpl | 35 +++++++++++ .../Templates/config/go_bin/table.tpl | 29 +++++++++ .../Templates/config/go_json/table.tpl | 25 ++++++++ .../Templates/config/java_bin/table.tpl | 22 +++++++ .../Templates/config/java_json/table.tpl | 23 +++++++ .../Templates/config/lua_bin/all.tpl | 2 + .../Templates/config/lua_lua/all.tpl | 2 + .../Templates/config/python_json/table.tpl | 12 ++++ .../Templates/config/rust_json/table.tpl | 26 ++++++++ .../Templates/config/typescript_bin/table.tpl | 22 +++++++ .../config/typescript_json/table.tpl | 21 +++++++ 20 files changed, 420 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 76ed3f9..f74180e 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ luban相较于常规的excel导表工具有以下核心优势: - 支持数据标签。 可以选择导出符合要求的数据,发布正式数据时策划不必手动注释掉那些测试数据了 - 强大的数据校验能力。支持内建数据格式检查;支持ref表引用检查(策划不用担心填错id);支持path资源检查(策划不用担心填错资源路径);支持range检查 - 支持常量别名。策划不必再为诸如 升级丹 这样的道具手写具体道具id了 -- 支持多种常见数据表模式。 one(单例表)、map(常规key-value表) +- 支持多种常见数据表模式。 singleton(单例表)、map(常规key-value表)、**list(支持无索引、多主键联合索引、多主键独立索引)** - 支持res资源标记。可以一键导出配置中引用的所有资源列表(icon,ui,assetbundle等等) - 统一了自定义编辑器的配置数据。与Unity和UE4的自定义编辑器良好配合,为编辑器生成合适的加载与保存json配置的的c#(Unity)或c++(UE4)代码。保存的json配置能够被luban识别和处理。 - 支持emmylua anntations。生成的lua包含符合emmylua 格式anntations信息。配合emmylua有良好的配置代码提示能力 @@ -423,7 +423,66 @@ xml中定义如下 +### 列表表 (无主键) +有时候只想得到一个记录列表,无主键。mode="list"并且index为空,表示无主键表。 + +定义表 +```xml + +``` + +示例数据表 + +|##|x|y|z| num| +|-|-|-|-|-| +|##type|int|long|string|int| +||1|1|aaa|123| +||1|1|bbb|124| +||1|2|aaa|134| +||2|1|aaa|124| +||5|6|xxx|898| + + +### 多主键表(联合索引) + +多个key构成联合唯一主键。使用"+"分割key,表示联合关系。 + +定义表 +```xml +
+``` + +示例数据表 + +|##|key1|key2|key3| num| +|-|-|-|-|-| +|##type|int|long|string|int| +||1|1|aaa|123| +||1|1|bbb|124| +||1|2|aaa|134| +||2|1|aaa|124| +||5|6|xxx|898| + +### 多主键表(独立索引) + +多个key,各自独立唯一索引。与联合索引写法区别在于使用 ","来划分key,表示独立关系。 + +定义表 +```xml +
+``` + +示例数据表 + +|##|key1|key2|key3| num| +|-|-|-|-|-| +|##type|int|long|string|int| +||1|2|aaa|123| +||2|4|bbb|124| +||3|6|ccc|134| +||4|8|ddd|124| +||5|1|eee|898| ### 单例表 有一些配置全局只有一份,比如 公会模块的开启等级,背包初始大小,背包上限。此时使用单例表来配置这些数据比较合适。 diff --git a/src/Luban.Job.Cfg/Source/DataExporters/LuaExportor.cs b/src/Luban.Job.Cfg/Source/DataExporters/LuaExportor.cs index e167998..6b2399f 100644 --- a/src/Luban.Job.Cfg/Source/DataExporters/LuaExportor.cs +++ b/src/Luban.Job.Cfg/Source/DataExporters/LuaExportor.cs @@ -30,5 +30,18 @@ namespace Luban.Job.Cfg.DataExporters } s.Append('}'); } + + public void ExportTableList(DefTable t, List records, StringBuilder s) + { + s.Append("return").AppendLine(); + s.Append('{').AppendLine(); + foreach (Record r in records) + { + DBean d = r.Data; + s.Append(d.Apply(ToLuaLiteralVisitor.Ins)); + s.Append(',').AppendLine(); + } + s.Append('}'); + } } } diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index 9291f39..b0c0ec2 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -26,7 +26,7 @@ namespace Luban.Job.Cfg.Defs public RefValidator Ref { get; private set; } // 如果ref了多个表,不再生成 xxx_ref之类的字段,也不会resolve - public bool GenRef => Ref != null && Ref.Tables.Count == 1; + public bool GenRef => Ref != null && Ref.GenRef; public bool HasRecursiveRef => (CType.IsBean) || (CType is TArray ta && ta.ElementType.IsBean) diff --git a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs index 58f3683..3920035 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs @@ -132,7 +132,7 @@ namespace Luban.Job.Cfg.Defs } case ETableMode.LIST: { - var indexs = Index.Split(',', '|', '+', '&').Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).ToList(); + var indexs = Index.Split('+', ',').Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).ToList(); foreach (var idx in indexs) { if (ValueTType.GetBeanAs().TryGetField(idx, out var f, out var i)) @@ -147,7 +147,7 @@ namespace Luban.Job.Cfg.Defs } } // 如果不是 union index, 每个key必须唯一,否则 (key1,..,key n)唯一 - IsUnionIndex = IndexList.Count > 1 && !Index.Contains('|'); + IsUnionIndex = IndexList.Count > 1 && !Index.Contains(','); break; } default: throw new Exception($"unknown mode:'{Mode}'"); diff --git a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs index 8db19fe..726b9e2 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs @@ -80,6 +80,11 @@ namespace Luban.Job.Cfg.Utils LuaExportor.Ins.ExportTableMap(table, records, content); break; } + case ETableMode.LIST: + { + LuaExportor.Ins.ExportTableList(table, records, content); + break; + } default: { throw new NotSupportedException(); diff --git a/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs b/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs index a49c083..919066e 100644 --- a/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs +++ b/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs @@ -16,17 +16,14 @@ namespace Luban.Job.Cfg.Validators public class RefValidator : IValidator { - public static string GetActualTableName(string table) - { - return table.EndsWith("?") ? table.Substring(0, table.Length - 1) : table; - } - public List Tables { get; } public string FirstTable => GetActualTableName(Tables[0]); public TType Type { get; } + public bool GenRef { get; private set; } + public RefValidator(TType type, string tablesStr) { Type = type; @@ -90,7 +87,14 @@ namespace Luban.Job.Cfg.Validators #endif } - private (string TableName, string FieldName, bool IgnoreDefault) ParseRefString(string refStr) + + private static string GetActualTableName(string table) + { + var (actualTable, _, _) = ParseRefString(table); + return actualTable; + } + + private static (string TableName, string FieldName, bool IgnoreDefault) ParseRefString(string refStr) { bool ignoreDefault = false; @@ -126,6 +130,7 @@ namespace Luban.Job.Cfg.Validators } var assembly = ((DefField)def).Assembly; + bool first = true; foreach (var table in Tables) { var (actualTable, indexName, ignoreDefault) = ParseRefString(table); @@ -162,6 +167,10 @@ namespace Luban.Job.Cfg.Validators } else if (ct.IsMapTable) { + if (first && Tables.Count == 1) + { + GenRef = true; + } if (!string.IsNullOrEmpty(indexName)) { throw new Exception($"结构:{hostTypeName} 字段:{fieldName} ref:{actualTable} 是map表,不能索引子字段"); @@ -188,6 +197,7 @@ namespace Luban.Job.Cfg.Validators throw new Exception($"type:'{hostTypeName}' field:'{fieldName}' 类型:'{Type.TypeName}' 与 被引用的list表:'{actualTable}' key:{indexName} 类型:'{indexField.Type.TypeName}' 不一致"); } } + first = false; } } } diff --git a/src/Luban.Server/Templates/config/cpp_bin/table.tpl b/src/Luban.Server/Templates/config/cpp_bin/table.tpl index 5bd62e0..1d62615 100644 --- a/src/Luban.Server/Templates/config/cpp_bin/table.tpl +++ b/src/Luban.Server/Templates/config/cpp_bin/table.tpl @@ -58,6 +58,43 @@ class {{name}} } } + {{~else if x.is_list_table~}} + private: + ::bright::Vector<{{cpp_define_type value_type}}> _dataList; + + public: + bool load(ByteBuf& _buf) + { + int n; + if (!_buf.readSize(n)) return false; + for(; n > 0 ; --n) + { + {{cpp_define_type value_type}} _v; + {{cpp_deserialize '_buf' '_v' value_type}} + _dataList.push_back(_v); + } + return true; + } + + const ::bright::Vector<{{cpp_define_type value_type}}>& getDataList() const { return _dataList; } + + {{value_type.bean.cpp_full_name}}* getRaw(size_t index) const + { + return _dataList[index].get(); + } + + {{cpp_define_type value_type}} get(size_t index) const + { + return _dataList[index]; + } + + void resolve(::bright::HashMap<::bright::String, void*>& _tables) + { + for(auto v : _dataList) + { + v->resolve(_tables); + } + } {{~else~}} private: {{cpp_define_type value_type}} _data; diff --git a/src/Luban.Server/Templates/config/cs_bin/table.tpl b/src/Luban.Server/Templates/config/cs_bin/table.tpl index cfdd263..a6bc135 100644 --- a/src/Luban.Server/Templates/config/cs_bin/table.tpl +++ b/src/Luban.Server/Templates/config/cs_bin/table.tpl @@ -61,7 +61,40 @@ public sealed class {{name}} v.TranslateText(translator); } } + {{~else if x.is_list_table ~}} + private readonly List<{{cs_define_type value_type}}> _dataList; + + public {{name}}(ByteBuf _buf) + { + _dataList = new List<{{cs_define_type value_type}}>(); + + for(int n = _buf.ReadSize() ; n > 0 ; --n) + { + {{cs_define_type value_type}} _v; + {{cs_deserialize '_buf' '_v' value_type}} + } + } + public List<{{cs_define_type value_type}}> DataList => _dataList; + + public {{cs_define_type value_type}} Get(int index) => _dataList[index]; + public {{cs_define_type value_type}} this[int index] => _dataList[index]; + + public void Resolve(Dictionary _tables) + { + foreach(var v in _dataList) + { + v.Resolve(_tables); + } + } + + public void TranslateText(System.Func translator) + { + foreach(var v in _dataList) + { + v.TranslateText(translator); + } + } {{~else~}} private readonly {{cs_define_type value_type}} _data; diff --git a/src/Luban.Server/Templates/config/cs_json/table.tpl b/src/Luban.Server/Templates/config/cs_json/table.tpl index d364360..8c0beac 100644 --- a/src/Luban.Server/Templates/config/cs_json/table.tpl +++ b/src/Luban.Server/Templates/config/cs_json/table.tpl @@ -63,7 +63,41 @@ public sealed class {{name}} v.TranslateText(translator); } } + + {{~else if x.is_list_table ~}} + private readonly List<{{cs_define_type value_type}}> _dataList; + + public {{name}}(JsonElement _json) + { + _dataList = new List<{{cs_define_type value_type}}>(); + + foreach(JsonElement _row in _json.EnumerateArray()) + { + var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row); + _dataList.Add(_v); + } + } + public List<{{cs_define_type value_type}}> DataList => _dataList; + + public {{cs_define_type value_type}} Get(int index) => _dataList[index]; + public {{cs_define_type value_type}} this[int index] => _dataList[index]; + + public void Resolve(Dictionary _tables) + { + foreach(var v in _dataList) + { + v.Resolve(_tables); + } + } + + public void TranslateText(System.Func translator) + { + foreach(var v in _dataList) + { + v.TranslateText(translator); + } + } {{~else~}} private readonly {{cs_define_type value_type}} _data; diff --git a/src/Luban.Server/Templates/config/cs_unity_json/table.tpl b/src/Luban.Server/Templates/config/cs_unity_json/table.tpl index 5d3e8b7..d9dc539 100644 --- a/src/Luban.Server/Templates/config/cs_unity_json/table.tpl +++ b/src/Luban.Server/Templates/config/cs_unity_json/table.tpl @@ -56,6 +56,41 @@ public sealed class {{name}} } } + public void TranslateText(System.Func translator) + { + foreach(var v in _dataList) + { + v.TranslateText(translator); + } + } + + {{~else if x.is_list_table ~}} + private readonly List<{{cs_define_type value_type}}> _dataList; + + public {{name}}(JSONNode _json) + { + _dataList = new List<{{cs_define_type value_type}}>(); + + foreach(JSONNode _row in _json.Children) + { + var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row); + _dataList.Add(_v); + } + } + + public List<{{cs_define_type value_type}}> DataList => _dataList; + + public {{cs_define_type value_type}} Get(int index) => _dataList[index]; + public {{cs_define_type value_type}} this[int index] => _dataList[index]; + + public void Resolve(Dictionary _tables) + { + foreach(var v in _dataList) + { + v.Resolve(_tables); + } + } + public void TranslateText(System.Func translator) { foreach(var v in _dataList) diff --git a/src/Luban.Server/Templates/config/go_bin/table.tpl b/src/Luban.Server/Templates/config/go_bin/table.tpl index cd0aac2..1714a27 100644 --- a/src/Luban.Server/Templates/config/go_bin/table.tpl +++ b/src/Luban.Server/Templates/config/go_bin/table.tpl @@ -59,6 +59,35 @@ func (table *{{go_full_name}}) Get(key {{go_define_type key_type}}) {{go_define_ return table._dataMap[key] } +{{~else if x.is_list_table~}} +type {{go_full_name}} struct { + _dataList []{{go_define_type value_type}} +} + +func New{{go_full_name}}(_buf *serialization.ByteBuf) (*{{go_full_name}}, error) { + if size, err := _buf.ReadSize() ; err != nil { + return nil, err + } else { + _dataList := make([]{{go_define_type value_type}}, 0, size) + + for i := 0 ; i < size ; i++ { + if _v, err2 := {{go_deserialize_type value_type '_buf'}}; err2 != nil { + return nil, err2 + } else { + _dataList = append(_dataList, _v) + } + } + return &{{go_full_name}}{_dataList:_dataList}, nil + } +} + +func (table *{{go_full_name}}) GetDataList() []{{go_define_type value_type}} { + return table._dataList +} + +func (table *{{go_full_name}}) Get(index int) {{go_define_type value_type}} { + return table._dataList[index] +} {{~else~}} diff --git a/src/Luban.Server/Templates/config/go_json/table.tpl b/src/Luban.Server/Templates/config/go_json/table.tpl index ec0caf1..498b32b 100644 --- a/src/Luban.Server/Templates/config/go_json/table.tpl +++ b/src/Luban.Server/Templates/config/go_json/table.tpl @@ -53,6 +53,31 @@ func (table *{{go_full_name}}) Get(key {{go_define_type key_type}}) {{go_define_ } +{{~else if x.is_list_table~}} +type {{go_full_name}} struct { + _dataList []{{go_define_type value_type}} +} + +func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) { + _dataList := make([]{{go_define_type value_type}}, 0, len(_buf)) + for _, _ele_ := range _buf { + if _v, err2 := {{go_deserialize_type value_type '_ele_'}}; err2 != nil { + return nil, err2 + } else { + _dataList = append(_dataList, _v) + } + } + return &{{go_full_name}}{_dataList:_dataList}, nil +} + +func (table *{{go_full_name}}) GetDataList() []{{go_define_type value_type}} { + return table._dataList +} + +func (table *{{go_full_name}}) Get(index int) {{go_define_type value_type}} { + return table._dataList[index] +} + {{~else~}} import "errors" diff --git a/src/Luban.Server/Templates/config/java_bin/table.tpl b/src/Luban.Server/Templates/config/java_bin/table.tpl index d609042..d00cffc 100644 --- a/src/Luban.Server/Templates/config/java_bin/table.tpl +++ b/src/Luban.Server/Templates/config/java_bin/table.tpl @@ -41,6 +41,28 @@ public final class {{name}} { {{~end~}} public {{java_box_define_type value_type}} get({{java_define_type key_type}} key) { return _dataMap.get(key); } + public void resolve(java.util.HashMap _tables) { + for({{java_box_define_type value_type}} v : _dataList) { + v.resolve(_tables); + } + } + {{~else if x.is_list_table ~}} + private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; + + public {{name}}(ByteBuf _buf) { + _dataList = new java.util.ArrayList<{{java_box_define_type value_type}}>(); + + for(int n = _buf.readSize() ; n > 0 ; --n) { + {{java_box_define_type value_type}} _v; + {{java_deserialize '_buf' '_v' value_type}} + _dataList.add(_v); + } + } + + public java.util.ArrayList<{{java_box_define_type value_type}}> getDataList() { return _dataList; } + + public {{java_box_define_type value_type}} get(int index) { return _dataList.get(index); } + public void resolve(java.util.HashMap _tables) { for({{java_box_define_type value_type}} v : _dataList) { v.resolve(_tables); diff --git a/src/Luban.Server/Templates/config/java_json/table.tpl b/src/Luban.Server/Templates/config/java_json/table.tpl index 9c45d2d..0ef0542 100644 --- a/src/Luban.Server/Templates/config/java_json/table.tpl +++ b/src/Luban.Server/Templates/config/java_json/table.tpl @@ -47,6 +47,29 @@ public final class {{name}} { } } + {{~else if x.is_list_table ~}} + private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; + + public {{name}}(JsonElement __json__) { + _dataList = new java.util.ArrayList<{{java_box_define_type value_type}}>(); + + for(com.google.gson.JsonElement _e_ : __json__.getAsJsonArray()) { + {{java_box_define_type value_type}} _v; + {{java_deserialize '_e_.getAsJsonObject()' '_v' value_type}} + _dataList.add(_v); + } + } + + public java.util.ArrayList<{{java_box_define_type value_type}}> getDataList() { return _dataList; } + + public {{java_box_define_type value_type}} get(int index) { return _dataList.get(index); } + + public void resolve(java.util.HashMap _tables) { + for({{java_box_define_type value_type}} v : _dataList) { + v.resolve(_tables); + } + } + {{~else~}} private final {{java_define_type value_type}} _data; diff --git a/src/Luban.Server/Templates/config/lua_bin/all.tpl b/src/Luban.Server/Templates/config/lua_bin/all.tpl index 580e7bc..02734bf 100644 --- a/src/Luban.Server/Templates/config/lua_bin/all.tpl +++ b/src/Luban.Server/Templates/config/lua_bin/all.tpl @@ -114,6 +114,8 @@ local function InitTypes(methods) {{~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.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.bean.full_name}}' }, {{~else~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.bean.full_name}}'}, {{~end~}} diff --git a/src/Luban.Server/Templates/config/lua_lua/all.tpl b/src/Luban.Server/Templates/config/lua_lua/all.tpl index 2ad16d3..07eb94e 100644 --- a/src/Luban.Server/Templates/config/lua_lua/all.tpl +++ b/src/Luban.Server/Templates/config/lua_lua/all.tpl @@ -29,6 +29,8 @@ 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.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.bean.full_name}}' }, {{~else~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.bean.full_name}}'}, {{end}} diff --git a/src/Luban.Server/Templates/config/python_json/table.tpl b/src/Luban.Server/Templates/config/python_json/table.tpl index 8732943..700f51b 100644 --- a/src/Luban.Server/Templates/config/python_json/table.tpl +++ b/src/Luban.Server/Templates/config/python_json/table.tpl @@ -22,6 +22,18 @@ class {{name}}: def getDataList(self) : return self._dataList def get(self, key) : return self._dataMap.get(key) + {{~else if x.is_list_table ~}} + + def __init__(self, _json_ ): + self._dataList = [] + + for _json2_ in _json_: + {{py3_deserialize_value '_v' '_json2_' value_type}} + self._dataList.append(_v) + + def getDataList(self) : return self._dataList + + def get(self, index) : return self._dataList[index] {{~else~}} diff --git a/src/Luban.Server/Templates/config/rust_json/table.tpl b/src/Luban.Server/Templates/config/rust_json/table.tpl index a7b260c..15bb07b 100644 --- a/src/Luban.Server/Templates/config/rust_json/table.tpl +++ b/src/Luban.Server/Templates/config/rust_json/table.tpl @@ -13,6 +13,8 @@ pub struct {{name}} { {{~if x.is_map_table ~}} data_list: Vec>, data_map: std::collections::HashMap<{{rust_define_type key_type}}, std::rc::Rc<{{rust_define_type value_type}}>>, + {{~else if x.is_list_table ~}} + data_list: Vec>, {{~else~}} data: {{rust_class_name value_type}}, {{~end~}} @@ -54,6 +56,30 @@ impl {{name}}{ pub fn get_data_list(self:&{{name}}) -> &Vec> { &self.data_list } #[allow(dead_code)] pub fn get(self:&{{name}}, key: &{{rust_define_type key_type}}) -> std::option::Option<&std::rc::Rc<{{rust_define_type value_type}}>> { self.data_map.get(key) } + + {{~else if x.is_list_table ~}} + if !__js.is_array() { + return Err(LoadError{}); + } + let mut t = {{name}} { + data_list : Vec::new(), + }; + + for __e in __js.members() { + let __v = std::rc::Rc::new(match {{rust_class_name value_type}}::new(__e) { + Ok(x) => x, + Err(err) => return Err(err), + }); + let __v2 = std::rc::Rc::clone(&__v); + t.data_list.push(__v); + } + Ok(t) + } + + #[allow(dead_code)] + pub fn get_data_list(self:&{{name}}) -> &Vec> { &self.data_list } + #[allow(dead_code)] + pub fn get(self:&{{name}}, index: usize) -> &std::rc::Rc<{{rust_define_type value_type}}> { &self.data_list[index] } {{~else~}} if !__js.is_array() || __js.len() != 1 { return Err(LoadError{}); diff --git a/src/Luban.Server/Templates/config/typescript_bin/table.tpl b/src/Luban.Server/Templates/config/typescript_bin/table.tpl index 546c6c9..50bc705 100644 --- a/src/Luban.Server/Templates/config/typescript_bin/table.tpl +++ b/src/Luban.Server/Templates/config/typescript_bin/table.tpl @@ -33,6 +33,28 @@ export class {{name}} { get(key: {{ts_define_type key_type}}): {{ts_define_type value_type}} | undefined { return this._dataMap.get(key) } + resolve(_tables: Map) { + for(var v of this._dataList) { + v.resolve(_tables) + } + } + {{~else if x.is_list_table ~}} + private _dataList: {{ts_define_type value_type}}[] + + constructor(_buf_: ByteBuf) { + this._dataList = [] + + for(let n = _buf_.ReadInt() ; n > 0 ; n--) { + let _v: {{ts_define_type value_type}} + {{ts_bin_constructor '_v' '_buf_' value_type}} + this._dataList.push(_v) + } + } + + getDataList(): {{ts_define_type value_type}}[] { return this._dataList } + + get(index: number): {{ts_define_type value_type}} | undefined { return this._dataList[index] } + resolve(_tables: Map) { for(var v of this._dataList) { v.resolve(_tables) diff --git a/src/Luban.Server/Templates/config/typescript_json/table.tpl b/src/Luban.Server/Templates/config/typescript_json/table.tpl index 1dcd809..4547d26 100644 --- a/src/Luban.Server/Templates/config/typescript_json/table.tpl +++ b/src/Luban.Server/Templates/config/typescript_json/table.tpl @@ -31,6 +31,27 @@ export class {{name}}{ get(key: {{ts_define_type key_type}}): {{ts_define_type value_type}} | undefined { return this._dataMap.get(key); } + resolve(_tables: Map) { + for(var v of this._dataList) { + v.resolve(_tables) + } + } + {{~else if x.is_list_table ~}} + private _dataList: {{ts_define_type value_type}}[] + + constructor(_json_: any) { + this._dataList = [] + for(var _json2_ of _json_) { + let _v: {{ts_define_type value_type}} + {{ts_json_constructor '_v' '_json2_' value_type}} + this._dataList.push(_v) + } + } + + getDataList(): {{ts_define_type value_type}}[] { return this._dataList } + + get(index: number): {{ts_define_type value_type}} | undefined { return this._dataList[index] } + resolve(_tables: Map) { for(var v of this._dataList) { v.resolve(_tables)