初始化工程

This commit is contained in:
2025-07-15 15:33:35 +08:00
parent ead49da3e8
commit bbd78128d0
301 changed files with 23953 additions and 0 deletions

View File

@@ -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}}

View File

@@ -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}}

View File

@@ -0,0 +1,30 @@
{{~if __this.comment != '' ~}}
//{{escape_comment __this.comment}}
{{~end~}}
enum {{__name}}
{
{{~if !has_enum_item __this~}}
empty_placeholder(0);
{{~else~}}
{{~if !__this.has_zero_value_item ~}}
None(0),
{{~end~}}
{{~end~}}
{{~ for item in __this.items ~}}
{{~if item.comment_or_alias != '' ~}}
//{{escape_comment item.comment_or_alias}}
{{~end~}}
{{item.name}}({{item.int_value}}) {{is_last_enum_item __this item.int_value ? ';' : ','}}
{{~end~}}
final int value;
const {{__name}}(this.value);
static {{__name}} fromValue(int value)
{
return {{__name}}.values.firstWhere((element) => element.value == value, orElse: () => fromValue(0));
}
}

View File

@@ -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~}}
)

View File

@@ -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~}}
}

View File

@@ -0,0 +1,2 @@

View File

@@ -0,0 +1,14 @@
[package]
name = "macros"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
quote = "1.0.36"
syn = "2.0.60"
proc-macro2 = "1.0.82"
[lib]
proc-macro = true

View File

@@ -0,0 +1,65 @@
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
use proc_macro2;
use quote::{format_ident, quote, ToTokens};
use syn::{parse_macro_input, Data, DeriveInput};
#[proc_macro_derive(TryIntoBase)]
pub fn base_try_from(item: TokenStream) -> TokenStream {
let derive_input = parse_macro_input!(item as DeriveInput);
let ty_name = &derive_input.ident;
match derive_input.data {
Data::Struct(_) => {}
_ => panic!("base_try_from can only be used on structs or enums"),
}
let expanded = quote! {
impl<'a> TryFrom<&'a AbstractBase> for &'a #ty_name {
type Error = String;
fn try_from(value: &'a AbstractBase) -> Result<Self, Self::Error> {
let r = value.downcast_ref::<#ty_name>();
if let Some(v) = r {
return Ok(v);
}
Err(concat!("can not into to ", stringify!(#ty_name)).to_string())
}
}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(EnumFromNum)]
pub fn enum_from_num(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let ty_name = &input.ident;
let tokens = vec![
format_ident!("i64"),
format_ident!("i16"),
format_ident!("i8"),
format_ident!("isize"),
format_ident!("u64"),
format_ident!("u32"),
format_ident!("u16"),
format_ident!("u8"),
format_ident!("usize"),
format_ident!("f64"),
format_ident!("f32"),
];
quote! {
#(
impl From<#tokens> for #ty_name {
fn from(value: #tokens) -> Self {
(value as i32).into()
}
}
)*
}.into()
}

View File

@@ -0,0 +1,2 @@

View File

@@ -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, {{__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}}

View File

@@ -0,0 +1,45 @@
#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;
}
{{~if bean.is_abstract_type~}}
bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, {{make_cpp_name bean.full_name}}*& _out)
{
int32_t 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 = LUBAN_NEW({{make_type_cpp_name child}}); if (_out->deserialize(_buf)) { return true; } else { _out = nullptr; return false;} }
{{~end~}}
default: { _out = nullptr; return false;}
}
}
{{~else~}}
bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, {{make_cpp_name bean.full_name}}*& _out)
{
_out = LUBAN_NEW({{make_type_cpp_name bean}});
return _out->deserialize(_buf);
}
{{~end~}}
{{~end~}}
{{namespace_with_grace_end __top_module}}

View File

@@ -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}}

View File

@@ -0,0 +1,134 @@
{{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:
~{{__name}}()
{
for (auto& _v : _dataList)
{
LUBAN_FREE(_v);
}
}
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; }
{{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}};
}
{{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~}}
{{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}}

View File

@@ -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;
}
};

View File

@@ -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}}

View File

@@ -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~}}
int32_t 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(LUBAN_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(LUBAN_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}}

View File

@@ -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}}

View File

@@ -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}}

View File

@@ -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;
}
};

View File

@@ -0,0 +1,150 @@
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 kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\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~}}
{{~ line = generate_resolve_field_ref field ~}}
{{~ if line != ''~}}
{{line}}
{{~end~}}
{{~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}}

View File

@@ -0,0 +1,169 @@
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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
_data.ResolveRef(tables);
{{~end~}}
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}

View File

@@ -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}}

View File

@@ -0,0 +1,151 @@
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 kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\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~}}
{{~ line = generate_resolve_field_ref field ~}}
{{~ if line != ''~}}
{{line}}
{{~end~}}
{{~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}}

View File

@@ -0,0 +1,170 @@
using Luban;
using System.Text.Json;
{{
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}}(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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
_data.ResolveRef(tables);
{{~end~}}
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}

View File

@@ -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}}

View File

@@ -0,0 +1,101 @@
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}}

View File

@@ -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}}

View File

@@ -0,0 +1,158 @@
using Luban;
using Newtonsoft.Json.Linq;
{{
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 kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\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}}(JToken _buf) {{if parent_def_type}} : base(_buf) {{end}}
{
JObject _obj = _buf as JObject;
{{~ for field in export_fields
fieldName = format_property_name __code_style field.name
~}}
{{deserialize_field fieldName '_obj' 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}}(JToken _buf)
{
{{~if __bean.is_abstract_type~}}
var _obj=_buf as JObject;
switch (_obj.GetValue("$type").ToString())
{
{{~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~}}
{{~ line = generate_resolve_field_ref field ~}}
{{~ if line != ''~}}
{{line}}
{{~end~}}
{{~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}}

View File

@@ -0,0 +1,177 @@
using Newtonsoft.Json.Linq;
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}}(JArray _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(JObject _ele in _buf)
{
{{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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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}}(JArray _buf)
{
_dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
foreach(JObject _ele in _buf)
{
{{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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~else~}}
private readonly {{declaring_type_name __value_type}} _data;
public {{declaring_type_name __value_type}} Data => _data;
public {{__name}}(JArray _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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
_data.ResolveRef(tables);
{{~end~}}
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}

View File

@@ -0,0 +1,32 @@
using Newtonsoft.Json.Linq;
{{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, JArray> 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}}

View File

@@ -0,0 +1,151 @@
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 kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\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~}}
{{~ line = generate_resolve_field_ref field ~}}
{{~ if line != ''~}}
{{line}}
{{~end~}}
{{~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}}

View File

@@ -0,0 +1,170 @@
using Luban;
using SimpleJSON;
{{
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}}(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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
foreach(var _v in _dataList)
{
_v.ResolveRef(tables);
}
{{~end~}}
}
{{~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)
{
{{~if is_bean_need_resolve_ref value_type ~}}
_data.ResolveRef(tables);
{{~end~}}
}
{{~end~}}
}
{{namespace_with_grace_end __namespace_with_top_module}}

View File

@@ -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}}

View File

@@ -0,0 +1,32 @@
using Google.Protobuf;
using Google.Protobuf.Collections;
using System.Reflection;
{{namespace_with_grace_begin __namespace}}
public partial class {{__name}}
{
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/// <summary>
/// {{escape_comment table.comment}}
/// </summary>
{{~end~}}
public {{proto_full_name table.full_name}} {{format_property_name __code_style table.name}} { get; }
{{~end~}}
public {{__name}}(System.Func<string, byte[]> loader)
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}} = {{proto_full_name table.full_name}}.Parser.ParseFrom(loader("{{table.output_data_file}}"));
{{~end~}}
}
public {{__name}}(System.Func<string, string> loader)
{
{{~for table in __tables ~}}
{{format_property_name __code_style table.name}} = {{proto_full_name table.full_name}}.Parser.ParseJson(loader("{{table.output_data_file}}"));
{{~end~}}
}
}
{{namespace_with_grace_end __namespace}}

View File

@@ -0,0 +1,143 @@
import 'dart:ffi';
import 'dart:collection';
import '/gen/Tables.dart';
{{~
parent_def_type = __this.parent_def_type
export_fields = __this.export_fields
hierarchy_export_fields = __this.hierarchy_export_fields
~}}
{{for field in hierarchy_export_fields}}{{import_ref_type_dart field '/gen/'}}{{end}}
{{if parent_def_type}}{{declaring_import_bean parent_def_type '/gen/'}}{{end}}
{{~if __bean.is_abstract_type~}}
{{~for child in __this.hierarchy_not_abstract_children~}}
{{declaring_import_bean child '/gen/'}}
{{~end~}}
{{~end~}}
{{~
func get_ref_name
ret (format_property_name __code_style $0.name) + '_Ref'
end
func generate_resolve_field_ref
field = $0
fieldName = format_name_lower_camel field.name
refTable = get_ref_table field
if can_generate_ref field
tableName = format_name_lower_camel 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_name_lower_camel collection_ref_table.name
if field.ctype.type_name == 'list' || field.ctype.type_name == 'array'
line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '.empty(growable: true);' + '\n'
line2 = 'for (var _v in ' + fieldName + ') { var ref=(tables.'+tableName + '?.getOrDefault(_v))!;'+ (get_ref_name field) + '?.add(ref); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'set'
line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'for (var _v in ' + fieldName + ') { var ref= (tables.'+tableName + '?.getOrDefault(_v))!;'+ (get_ref_name field) + '?.add(ref); }' + '\n'
ret line1 + line2
else if field.ctype.type_name == 'map'
line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
line2 = 'for (var kvp in ' + fieldName + '.entries) { var ref= (tables.' + tableName + '?.getOrDefault(kvp.value))!;' + (get_ref_name field) + '?[kvp.key]= ref; }' + '\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 'for (var _e in ' + fieldName + ') { _e?.resolveRef(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'for (var _e in ' + fieldName + '.values) { _e?.resolveRef(tables); }'
else
ret ''
end
end
end
~}}
{{~if __bean.comment != '' ~}}
//{{escape_comment __bean.comment}}
{{~end~}}
{{class_modifier __this}} class {{__name}} {{if parent_def_type}}extends {{ __this.parent_def_type.name}}{{end}}
{
{{__name}}(
{{~if need_gen_constructor hierarchy_export_fields~}}
{
{{~ for field in hierarchy_export_fields ~}}
{{~if is_super_field field parent_def_type~}}
required super.{{format_name_lower_camel field.name}},
{{~else~}}
required this.{{format_name_lower_camel field.name}},
{{~end~}}
{{~end~}}
}
{{~end~}}
);
factory {{__name}}.deserialize(dynamic _buf){
{{~if __bean.is_abstract_type~}}
switch (_buf['\$type'])
{
{{~for child in __this.hierarchy_not_abstract_children~}}
case "{{impl_data_type child __this}}": return {{child.name}}.deserialize(_buf);
{{~end~}}
default: throw Exception('unknown type:$_buf[\$type]');
}
{{~else~}}
{{~ for field in hierarchy_export_fields
fieldName = format_name_lower_camel field.name
~}}
final {{fieldName}};
{{deserialize_field fieldName '_buf' field.name field.ctype}}
{{~end~}}
return {{__name}}(
{{~ for field in hierarchy_export_fields
fieldName = format_name_lower_camel field.name
~}}
{{fieldName}}:{{fieldName}},
{{~end~}}
);
{{~end~}}
}
{{~ for field in export_fields ~}}
{{~if field.comment != '' ~}}
//{{escape_comment field.comment}}
{{~end~}}
final {{declaring_type_name field.ctype}} {{format_name_lower_camel field.name}};
{{~if can_generate_ref field~}}
{{declaring_type_name (get_ref_type field)}}? {{get_ref_name field}};
{{~else if can_generate_collection_ref field~}}
{{declaring_collection_ref_name field.ctype}}? {{get_ref_name field}};
{{~end~}}
{{~end~}}
{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
static final int __ID__ = {{__this.id}};
{{~end~}}
{{method_modifier __bean}}
void resolveRef({{__manager_name}} tables)
{
{{~if parent_def_type~}}
super.resolveRef(tables);
{{~end~}}
{{~for field in export_fields~}}
{{~ line = generate_resolve_field_ref field ~}}
{{~ if line != ''~}}
{{line}}
{{~end~}}
{{~end~}}
}
@override
String toString() {
return '{{__name}}({{for field in hierarchy_export_fields}}{{format_name_lower_camel field.name}}:${{format_name_lower_camel field.name}}, {{end}})';
}
}

View File

@@ -0,0 +1,145 @@
import 'dart:collection';
{{declaring_import_name __value_type '/gen/'}}
{{~if __table.is_singleton_table ~}}
{{for field in __value_type.def_bean.hierarchy_export_fields}}{{import_ref_type_dart field '/gen/'}}{{end}}
{{~end~}}
import '/gen/Tables.dart';
{{
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'Map<(' + (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
}}
{{~if __this.comment != '' ~}}
//{{escape_comment __this.comment}}
{{~end~}}
final class {{__name}} {
{{~if __table.is_map_table ~}}
final List<{{declaring_type_name __value_type}}> _dataList = [];
final Map<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap = {};
{{__name}}(List<dynamic> _array) {
for (var _buf in _array) {
{{declaring_type_name __value_type}} _item = {{declaring_type_name __value_type}}.deserialize(_buf);
_dataList.add(_item);
_dataMap[_item.{{format_field_name __code_style __this.index_field.name}}] = _item;
}
}
{{declaring_type_name __value_type}}? getOrDefault({{declaring_type_name __key_type}} id) {
if (_dataMap.containsKey(id)) {
return _dataMap[id];
}
return null;
}
void resolveRef({{__manager_name}} tables)
{
for(var _v in _dataList)
{
_v.resolveRef(tables);
}
}
{{~else if __table.is_list_table ~}}
final List<{{declaring_type_name __value_type}}> _dataList = [];
{{~if __table.is_union_index~}}
final {{table_union_map_type_name}} _dataMapUnion = {};
{{~else if !__table.index_list.empty?~}}
{{~for idx in __table.index_list~}}
final Map<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}}={};
{{~end~}}
{{~end~}}
{{__name}}(List<dynamic> _array) {
for (var _buf in _array) {
{{declaring_type_name __value_type}} _item = {{declaring_type_name __value_type}}.deserialize(_buf);
_dataList.add(_item);
}
{{~if __table.is_union_index~}}
for(var _v in _dataList)
{
_dataMapUnion[({{table_key_list "_v"}})]= _v;
}
{{~else if !__table.index_list.empty?~}}
for(var _v in _dataList)
{
{{~for idx in __table.index_list~}}
_dataMap_{{idx.index_field.name}}[_v.{{format_property_name __code_style idx.index_field.name}}]= _v;
{{~end~}}
}
{{~end~}}
}
List<{{declaring_type_name __value_type}}> get dataList => _dataList;
{{~if __table.is_union_index~}}
{{declaring_type_name __value_type}}? get({{table_param_def_list}}) => _dataMapUnion[({{table_param_name_list}})];
{{~else if !__table.index_list.empty? ~}}
{{~for idx in __table.index_list~}}
{{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}}[key];
{{~end~}}
{{~end~}}
void resolveRef({{__manager_name}} tables)
{
}
{{~else~}}
{{declaring_type_name __value_type}}? _data;
{{declaring_type_name __value_type}}? get data => _data;
{{__name}}(List<dynamic> _array) {
var n = _array.length;
if (n != 1)
{
throw Exception("table mode=one, but size != 1");
}
for (var _buf in _array) {
_data = {{declaring_type_name __value_type}}.deserialize(_buf);
}
}
{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/// <summary>
/// {{escape_comment field.comment}}
/// </summary>
{{~end~}}
{{declaring_null_type_name field.ctype}} get {{format_property_name __code_style field.name}} => _data?.{{format_name_lower_camel field.name}};
{{~end~}}
void resolveRef({{__manager_name}} tables)
{
}
{{~end~}}
}

View File

@@ -0,0 +1,43 @@
{{~
func get_table_inner_name
ret '_' + ($0 | string.downcase)
end
~}}
{{~for table in __tables ~}}
{{declaring_import_table table '/gen/'}}
{{~end~}}
final class {{__name}}
{
final Future<dynamic> Function(String filePath) _asyncloadFunction;
Tables(this._asyncloadFunction);
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
//{{escape_comment table.comment}}
{{~end~}}
{{table.name}}? _{{format_property_name __code_style table.name}};
{{~end~}}
Future<void> waitLoad() async {
var results = await Future.wait([
{{~for table in __tables ~}}
_asyncloadFunction("{{table.output_data_file}}"),
{{~end~}}
]);
{{ idx=0 }}
{{~for table in __tables ~}}
_{{format_property_name __code_style table.name}} = {{table.name}}(results[{{idx}}]);{{idx=idx+1}}
{{~end~}}
resolveRef();
}
{{~for table in __tables ~}}
{{table.name}}? get {{format_name_lower_camel table.name}} => _{{format_property_name __code_style table.name}};
{{~end~}}
void resolveRef(){
{{~for table in __tables ~}}
_{{format_property_name __code_style table.name}}?.resolveRef(this);
{{~end~}}
}
}

View File

@@ -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~}}

View File

@@ -0,0 +1,167 @@
@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}}]
{{~ for INDEX in table.index_list ~}}
var _{{INDEX.index_field.name}}_data_map: Dictionary
{{~ 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)
{{~ 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
{{~ for INDEX in table.index_list ~}}
func get_{{INDEX.index_field.name}}_data_map() -> Dictionary:
return self._{{INDEX.index_field.name}}_data_map
{{~ end ~}}
{{~ 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~}}

View File

@@ -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~}}

View File

@@ -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~}}

View File

@@ -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
}

View File

@@ -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~}}

View File

@@ -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~}}

View File

@@ -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
}

View File

@@ -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~}}
+ "}";
}
}

View File

@@ -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~}}
}

View File

@@ -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~}}
}
}

View File

@@ -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~}}
+ "}";
}
}

View File

@@ -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~}}
}

View File

@@ -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~}}
}
}

View File

@@ -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 }

View File

@@ -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 }

View File

@@ -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~}}

View File

@@ -0,0 +1,155 @@
{{~namespace_with_grace_begin __namespace~}}
{{~for enum in __enums~}}
{{~if enum.comment != '' ~}}
/**
* {{enum.comment | html.escape}}
*/
{{~end~}}
class {{full_name enum}} {
{{~for item in enum.items ~}}
{{~if item.comment != '' ~}}
/**
* {{escape_comment item.comment}}
*/
{{~end~}}
public const {{item.name}} = {{item.value}};
{{~end~}}
}
{{~end~}}
{{~for bean in __beans~}}
{{name = (full_name bean)}}
{{~if bean.comment != '' ~}}
/**
* {{escape_comment bean.comment}}
*/
{{~end~}}
{{class_modifier bean}} class {{name}}{{if bean.parent_def_type}} extends {{full_name bean.parent_def_type}}{{end}} {
{{~if bean.is_abstract_type~}}
public static function constructFrom($_json_) {
$type = $_json_['$type'];
switch ($type) {
{{~ for child in bean.hierarchy_not_abstract_children~}}
case '{{impl_data_type child bean}}': return new {{full_name child}}($_json_);
{{~end~}}
default: throw new \Exception("unknown type:$type");
}
}
{{~end~}}
public function __construct($_json_) {
{{~if bean.parent_def_type~}}
parent::__construct($_json_);
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{~if !field.ctype.is_nullable~}}
if (!array_key_exists('{{field.name}}', $_json_)) { throw new \Exception("field:'{{field.name}}' missing"); }
{{~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~}}
public ${{format_field_name __code_style field.name}};
{{~end~}}
}
{{~end~}}
{{~for table in __tables
key_type = table.key_ttype
value_type = table.value_ttype
name = (full_name table)
~}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
class {{name}} {
{{~if table.is_map_table ~}}
private $_dataMap;
private $_dataList;
public function __construct($_json_) {
$this->_dataMap = [];
$this->_dataList = [];
foreach ($_json_ as $_json2_) {
{{deserialize '$_v' '$_json2_' value_type}};
array_push($this->_dataList, $_v);
$this->_dataMap[$_v->{{format_field_name __code_style table.index_field.name}}] = $_v;
}
}
public function getDataMap() { return $this->_dataMap; }
public function getDataList() { return $this->_dataList; }
public function get($key) { return $this->_dataMap[$key]; }
{{~else if table.is_list_table ~}}
private $_dataList;
public function __construct($_json_) {
$this->_dataList = [];
foreach ($_json_ as $_json2_) {
{{deserialize '$_v' '$_json2_' value_type}};
array_push($this->_dataList, $_v);
}
}
public function getDataList() { return $this->_dataList; }
public function get($index) { return $this->_dataList[$index]; }
{{~else~}}
private $_data;
public function __construct($_json_) {
if (count($_json_) != 1) throw new \Exception('table:{{table.name}} mode=one, but size != 1');
{{deserialize '$this->_data' '$_json_[0]' value_type}};
}
public function getData() { return $this->_data; }
{{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
/**
* {{escape_comment field.comment}}
*/
{{~end~}}
public function get{{format_field_name __code_style field.name}}() { return $this->_data->{{format_field_name __code_style field.name}}; }
{{~end~}}
{{end}}
}
{{~end~}}
class {{__name}} {
{{~ for table in __tables ~}}
private $_{{table.name}};
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
public function get{{table.name}}() { return $this->_{{table.name}}; }
{{~end~}}
public function __construct($loader) {
{{~for table in __tables ~}}
$this->_{{table.name}} = new {{full_name table}}($loader('{{table.output_data_file}}'));
{{~end~}}
}
}
{{~namespace_with_grace_end __namespace~}}

View File

@@ -0,0 +1,156 @@
from enum import Enum
{{
func table_key_list
table = $0
varName = $1
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_name_list
table = $0
paramList = table.index_list |array.each do; ret $0.index_field.name; end
ret array.join paramList ', '
end
}}
{{~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_union_index~}}
def __init__(self, _json_ ):
self._dataMap = {}
self._dataList = []
for _json2_ in _json_:
{{deserialize '_v' '_json2_' value_type}}
self._dataList.append(_v)
self._dataMap[({{table_key_list table '_v'}})] = _v
def getDataMap(self) : return self._dataMap
def getDataList(self) : return self._dataList
def get(self, {{table_param_name_list table}}) : return self._dataMap.get(({{table_param_name_list table}}))
{{~else if table.is_list_table ~}}
def __init__(self, _json_ ):
self._dataList = []
{{~for idx in table.index_list~}}
self._dataMap_{{idx.index_field.name}} = {}
{{~end~}}
for _json2_ in _json_:
{{deserialize '_v' '_json2_' value_type}}
self._dataList.append(_v)
{{~for idx in table.index_list~}}
self._dataMap_{{idx.index_field.name}}[_v.{{format_property_name __code_style idx.index_field.name}}] = _v
{{~end~}}
def getDataList(self) : return self._dataList
def get(self, index) : return self._dataList[index]
{{~for idx in table.index_list~}}
def get_by_{{format_property_name __code_style idx.index_field.name}}(self, key): return self._dataMap_{{idx.index_field.name}}.get(key)
{{~end~}}
{{~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~}}

View File

@@ -0,0 +1,51 @@
pub mod prelude{
pub use crate::*;
{{~ for ns in __ns ~}}
pub use {{ns}}::*;
{{~end~}}
}
{{~ if __polymorphic_beans.count != 0 ~}}
type AbstractBase = dyn std::any::Any + Sync + Send;
pub trait GetBase<'a, T> {
fn get_base(&'a self) -> Result<T, LubanError>;
}
{{~end~}}
#[derive(Debug)]
pub enum LubanError {
Loader(String),
Table(String),
Bean(String),
Polymorphic(String),
Unknown(String),
}
impl std::fmt::Display for LubanError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
LubanError::Loader(msg) |
LubanError::Table(msg) |
LubanError::Bean(msg) |
LubanError::Polymorphic(msg) |
LubanError::Unknown(msg) => msg,
})
}
}
pub struct Tables{
{{~ for table in __tables ~}}
pub {{table.name}}: std::sync::Arc<{{full_name table}}>,
{{~end~}}
}
impl Tables {
pub fn new<T: Fn(&str) -> Result<ByteBuf, LubanError>>(loader: T) -> Result<Tables, LubanError> {
Ok(Tables {
{{~ for table in __tables ~}}
{{table.name}}: {{full_name table}}::new(loader("{{table.output_data_file}}")?)?,
{{~end~}}
})
}
}

View File

@@ -0,0 +1,280 @@
{{~ for mod in __mod.sub_mods ~}}
pub mod {{mod.name}};
{{~end~}}
{{~ if __mod.name != '' ~}}
use super::*;
{{~end~}}
use luban_lib::*;
{{~ for enum in __mod.enums ~}}
{{~ if enum.comment != '' ~}}
///{{enum.comment | html.escape}}
{{~end~}}
{{~ if enum.is_flags ~}}
bitflags::bitflags!{
#[derive(Debug, Hash, Eq, PartialEq)]
pub struct {{enum.name}} : u32 {
{{~ for item in enum.items ~}}
{{~if item.comment_or_alias != '' ~}}
///{{item.comment_or_alias | html.escape}}
{{~end~}}
const {{item.name}} = {{item.int_value}};
{{~end~}}
}
}
{{~else~}}
#[derive(Debug, Hash, Eq, PartialEq, macros::EnumFromNum)]
pub enum {{enum.name}} {
{{~ 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?~}}
None
{{~end~}}
}
impl From<i32> for {{enum.name}} {
fn from(value: i32) -> Self {
match value {
{{~ for item in enum.items ~}}
{{item.value}} => {{enum.name}}::{{item.name}},
{{~end~}}
_ => panic!("Invalid value for {{enum.name}}:{}", value),
}
}
}
{{~end~}}
{{~end~}}
{{~ for bean in __mod.beans
hierarchy_fields = bean.hierarchy_export_fields
~}}
#[derive(Debug)]
{{~if bean.parent != ''~}}
#[derive(macros::TryIntoBase)]
{{~end~}}
pub struct {{bean.name}} {
{{~ for field in hierarchy_fields ~}}
{{~if field.comment != '' ~}}
/// {{escape_comment field.comment}}
{{~end~}}
pub {{field.name}}: {{declaring_type_name field.ctype}},
{{~end~}}
}
{{~if bean.is_abstract_type~}}
impl {{bean.name}} {
pub fn new(mut buf: &mut ByteBuf) -> Result<std::sync::Arc<AbstractBase>, LubanError> {
let type_id = buf.read_int();
match type_id {
{{~for child in bean.hierarchy_not_abstract_children~}}
{{full_name child}}::__ID__ => Ok(std::sync::Arc::new({{full_name child}}::new(buf)?)),
{{~end~}}
_ => Err(LubanError::Bean(format!("Invalid type for {{bean.name}}:{}", type_id)))
}
}
}
pub trait T{{bean.name}} {
{{~ for field in hierarchy_fields ~}}
fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}};
{{~end~}}
}
{{~for child in bean.hierarchy_not_abstract_children~}}
impl {{base_trait_name bean}} for {{full_name child}} {
{{~ for field in hierarchy_fields ~}}
fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}} {
&self.{{field.name}}
}
{{~end~}}
}
{{~end~}}
impl<'a> GetBase<'a, &'a dyn {{base_trait_name bean}}> for AbstractBase {
fn get_base(&'a self) -> Result<&'a dyn {{base_trait_name bean}}, LubanError> {
{{~for child in bean.hierarchy_not_abstract_children~}}
let base: Result<&{{full_name child}}, _> = self.try_into();
if let Ok(r) = base {
return Ok(r);
}
{{~end~}}
Err(LubanError::Polymorphic(format!("Invalid type for {{bean.name}}")))
}
}
{{~else~}}
impl {{bean.name}}{
pub fn new(mut buf: &mut ByteBuf) -> Result<{{bean.name}}, LubanError> {
{{~ for field in hierarchy_fields ~}}
{{deserialize field.name 'buf' field.ctype}}
{{~end~}}
Ok({{bean.name}} { {{ for field in hierarchy_fields }}{{field.name}}, {{end}}})
}
pub const __ID__: i32 = {{bean.id}};
}
{{~end~}}
{{~end~}}
{{~ for table in __mod.tables
key_type = declaring_type_name table.key_ttype
if table.value_ttype.def_bean.is_abstract_type
value_type = declaring_type_name table.value_ttype
else
value_type = "std::sync::Arc<"+declaring_type_name table.value_ttype+">"
end
name = table.name
map_type = "std::collections::HashMap<"+key_type+", "+value_type+">"
~}}
{{
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'std::collections::HashMap<(' + (array.each table.index_list @index_type_name | array.join ', ') + '), ' + 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
}}
{{~ if table.comment != '' ~}}
///{{table.comment | html.escape}}
{{~end~}}
#[derive(Debug)]
pub struct {{table.name}} {
{{~if table.is_map_table ~}}
pub data_list: Vec<{{value_type}}>,
pub data_map: {{map_type}},
{{~else if table.is_list_table ~}}
pub data_list: Vec<{{value_type}}>,
{{~if table.is_union_index~}}
pub data_map_union: {{table_union_map_type_name}},
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
pub data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.type}}, {{value_type}}>,
{{~end~}}
{{~end~}}
{{~else~}}
pub data: {{declaring_type_name table.value_ttype}},
{{~end~}}
}
{{~if table.is_map_table ~}}
impl {{name}} {
pub fn new(mut buf: ByteBuf) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let mut data_map: {{map_type}} = Default::default();
let mut data_list: Vec<{{value_type}}> = vec![];
for x in (0..buf.read_size()).rev() {
{{deserialize_row "row" "buf" table.value_ttype}}
data_list.push(row.clone());
{{~ if table.value_ttype.def_bean.is_abstract_type ~}}
let key = <AbstractBase as GetBase<&dyn {{base_trait_name table.value_ttype.def_bean}}>>::get_base(std::ops::Deref::deref(&row))?;
data_map.insert(key.{{getter_name table.index_field.name}}().clone(), row.clone());
{{~else~}}
data_map.insert(row.{{table.index_field.name}}.clone(), row.clone());
{{~end~}}
}
Ok(std::sync::Arc::new({{name}} { data_map, data_list }))
}
pub fn get(&self, key: &{{key_type}}) -> Option<{{value_type}}> {
self.data_map.get(key).map(|x| x.clone())
}
}
impl std::ops::Index<{{key_type}}> for {{name}} {
type Output = {{value_type}};
fn index(&self, index: {{key_type}}) -> &Self::Output {
&self.data_map.get(&index).unwrap()
}
}
{{~else if table.is_list_table ~}}
impl {{name}} {
pub fn new(mut buf: ByteBuf) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let mut data_list: Vec<{{value_type}}> = vec![];
for x in (0..buf.read_size()).rev() {
{{deserialize_row "row" "buf" table.value_ttype}}
data_list.push(row.clone());
}
{{~if table.is_union_index~}}
let mut data_map_union: {{table_union_map_type_name}} = Default::default();
for x in &data_list {
data_map_union.insert(({{table_key_list "x"}}.clone()), x.clone());
}
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
let mut data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.index_field.ctype}}, {{value_type}}> = Default::default();
{{~end~}}
for x in &data_list {
{{~for idx in table.index_list~}}
data_map_{{idx.index_field.name}}.insert(x.{{format_property_name __code_style idx.index_field.name}}.clone(), x.clone());
{{~end~}}
}
{{~end~}}
Ok(std::sync::Arc::new({{table.name}} {
data_list,
{{~if table.is_union_index~}}
data_map_union,
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
data_map_{{idx.index_field.name}},
{{~end~}}
{{~end~}}
}))
}
{{~if table.is_union_index~}}
pub fn get(&self, key: &({{array.each table.index_list @index_type_name | array.join ', '}})) -> Option<{{value_type}}> {
self.data_map_union.get(key).map(|x| x.clone())
}
{{~else if !table.index_list.empty? ~}}
{{~for idx in table.index_list
index = format_property_name __code_style idx.index_field.name
~}}
pub fn get_by_{{index}}(&self, key: &{{declaring_type_name idx.type}}) -> Option<{{value_type}}> {
self.data_map_{{index}}.get(key).map(|x| x.clone())
}
{{~end~}}
{{~end~}}
}
{{~else~}}
impl {{name}} {
pub fn new(mut buf: ByteBuf) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let n = buf.read_size();
if n != 1 { return Err(LubanError::Table(format!("table mode=one, but size != 1"))); }
{{deserialize 'data' 'buf' table.value_ttype}}
Ok(std::sync::Arc::new({{name}} { data }))
}
}
{{~end~}}
{{~end~}}

View File

@@ -0,0 +1,11 @@
[package]
name = "{{__name}}"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
bitflags = { version = "2.5.x" , features = ["serde"] }
macros = { path = "../macros" }
luban_lib = { path = "../../luban_lib" }

View File

@@ -0,0 +1,51 @@
pub mod prelude{
pub use crate::*;
{{~ for ns in __ns ~}}
pub use {{ns}}::*;
{{~end~}}
}
{{~ if __polymorphic_beans.count != 0 ~}}
type AbstractBase = dyn std::any::Any + Sync + Send;
pub trait GetBase<'a, T> {
fn get_base(&'a self) -> Result<T, LubanError>;
}
{{~end~}}
#[derive(Debug)]
pub enum LubanError {
Loader(String),
Table(String),
Bean(String),
Polymorphic(String),
Unknown(String),
}
impl std::fmt::Display for LubanError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
LubanError::Loader(msg) |
LubanError::Table(msg) |
LubanError::Bean(msg) |
LubanError::Polymorphic(msg) |
LubanError::Unknown(msg) => msg,
})
}
}
pub struct Tables{
{{~ for table in __tables ~}}
pub {{table.name}}: std::sync::Arc<{{full_name table}}>,
{{~end~}}
}
impl Tables {
pub fn new<T: Fn(&str) -> Result<serde_json::Value, LubanError>>(loader: T) -> Result<Tables, LubanError> {
Ok(Tables {
{{~ for table in __tables ~}}
{{table.name}}: {{full_name table}}::new(&loader("{{table.output_data_file}}")?)?,
{{~end~}}
})
}
}

View File

@@ -0,0 +1,287 @@
{{~ for mod in __mod.sub_mods ~}}
pub mod {{mod.name}};
{{~end~}}
{{~ if __mod.name != '' ~}}
use super::*;
{{~end~}}
use serde::Deserialize;
{{~ for enum in __mod.enums ~}}
{{~ if enum.comment != '' ~}}
///{{enum.comment | html.escape}}
{{~end~}}
{{~ if enum.is_flags ~}}
bitflags::bitflags!{
#[derive(Debug, Hash, Eq, PartialEq)]
pub struct {{enum.name}} : u32 {
{{~ for item in enum.items ~}}
{{~if item.comment_or_alias != '' ~}}
///{{item.comment_or_alias | html.escape}}
{{~end~}}
const {{item.name}} = {{item.int_value}};
{{~end~}}
}
}
{{~else~}}
#[derive(Deserialize, Debug, Hash, Eq, PartialEq, macros::EnumFromNum)]
pub enum {{enum.name}} {
{{~ 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?~}}
None
{{~end~}}
}
impl From<i32> for {{enum.name}} {
fn from(value: i32) -> Self {
match value {
{{~ for item in enum.items ~}}
{{item.value}} => {{enum.name}}::{{item.name}},
{{~end~}}
_ => panic!("Invalid value for {{enum.name}}:{}", value),
}
}
}
{{~end~}}
{{~end~}}
{{~ for bean in __mod.beans
hierarchy_fields = bean.hierarchy_export_fields
~}}
#[derive(Debug)]
{{~if bean.parent != ''~}}
#[derive(macros::TryIntoBase)]
{{~end~}}
pub struct {{bean.name}} {
{{~ for field in hierarchy_fields ~}}
{{~if field.comment != '' ~}}
/// {{escape_comment field.comment}}
{{~end~}}
pub {{field.name}}: {{declaring_type_name field.ctype}},
{{~end~}}
}
{{~if bean.is_abstract_type~}}
impl {{bean.name}} {
pub fn new(json: &serde_json::Value) -> Result<std::sync::Arc<AbstractBase>, LubanError> {
let type_id = json["$type"].as_str().unwrap();
match type_id {
{{~for child in bean.hierarchy_not_abstract_children~}}
"{{impl_data_type child bean}}" => Ok(std::sync::Arc::new({{full_name child}}::new(json)?)),
{{~end~}}
_ => Err(LubanError::Bean(format!("Invalid type for {{bean.name}}:{}", type_id)))
}
}
}
pub trait T{{bean.name}} {
{{~ for field in hierarchy_fields ~}}
fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}};
{{~end~}}
}
{{~for child in bean.hierarchy_not_abstract_children~}}
impl {{base_trait_name bean}} for {{full_name child}} {
{{~ for field in hierarchy_fields ~}}
fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}} {
&self.{{field.name}}
}
{{~end~}}
}
{{~end~}}
impl<'a> GetBase<'a, &'a dyn {{base_trait_name bean}}> for AbstractBase {
fn get_base(&'a self) -> Result<&'a dyn {{base_trait_name bean}}, LubanError> {
{{~for child in bean.hierarchy_not_abstract_children~}}
let base: Result<&{{full_name child}}, _> = self.try_into();
if let Ok(r) = base {
return Ok(r);
}
{{~end~}}
Err(LubanError::Polymorphic(format!("Invalid type for {{bean.name}}")))
}
}
{{~else~}}
impl {{bean.name}}{
pub fn new(json: &serde_json::Value) -> Result<{{bean.name}}, LubanError> {
{{~ for field in hierarchy_fields ~}}
{{deserialize_field field.name 'json' field.ctype}}
{{~end~}}
Ok({{bean.name}} { {{ for field in hierarchy_fields }}{{field.name}}, {{end}}})
}
}
{{~end~}}
{{~end~}}
{{~ for table in __mod.tables
key_type = declaring_type_name table.key_ttype
if table.value_ttype.def_bean.is_abstract_type
value_type = declaring_type_name table.value_ttype
else
value_type = "std::sync::Arc<"+declaring_type_name table.value_ttype+">"
end
name = table.name
map_type = "std::collections::HashMap<"+key_type+", "+value_type+">"
~}}
{{
func index_type_name
ret (declaring_type_name $0.type)
end
func table_union_map_type_name
ret 'std::collections::HashMap<(' + (array.each table.index_list @index_type_name | array.join ', ') + '), ' + 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
}}
{{~ if table.comment != '' ~}}
///{{table.comment | html.escape}}
{{~end~}}
#[derive(Debug)]
pub struct {{table.name}} {
{{~if table.is_map_table ~}}
pub data_list: Vec<{{value_type}}>,
pub data_map: {{map_type}},
{{~else if table.is_list_table ~}}
pub data_list: Vec<{{value_type}}>,
{{~if table.is_union_index~}}
pub data_map_union: {{table_union_map_type_name}},
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
pub data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.type}}, {{value_type}}>,
{{~end~}}
{{~end~}}
{{~else~}}
pub data: {{declaring_type_name table.value_ttype}},
{{~end~}}
}
{{~if table.is_map_table ~}}
impl {{name}} {
pub fn new(json: &serde_json::Value) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let mut data_map: {{map_type}} = Default::default();
let mut data_list: Vec<{{value_type}}> = vec![];
for x in json.as_array().unwrap() {
{{~ if table.value_ttype.is_bean ~}}
{{deserialize_row "row" "x" table.value_ttype}}
{{~else~}}
let row: {{value_type}} = std::sync::Arc::new(serde_json::from_value(x.clone()).unwrap());
{{~end~}}
data_list.push(row.clone());
{{~ if table.value_ttype.def_bean.is_abstract_type ~}}
let key = <AbstractBase as GetBase<&dyn {{base_trait_name table.value_ttype.def_bean}}>>::get_base(std::ops::Deref::deref(&row))?;
data_map.insert(key.{{getter_name table.index_field.name}}().clone(), row.clone());
{{~else~}}
data_map.insert(row.{{table.index_field.name}}.clone(), row.clone());
{{~end~}}
}
Ok(std::sync::Arc::new({{name}} { data_map, data_list }))
}
pub fn get(&self, key: &{{key_type}}) -> Option<{{value_type}}> {
self.data_map.get(key).map(|x| x.clone())
}
}
impl std::ops::Index<{{key_type}}> for {{name}} {
type Output = {{value_type}};
fn index(&self, index: {{key_type}}) -> &Self::Output {
&self.data_map.get(&index).unwrap()
}
}
{{~else if table.is_list_table ~}}
impl {{name}} {
pub fn new(json: &serde_json::Value) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let mut data_list: Vec<{{value_type}}> = vec![];
for x in json.as_array().unwrap() {
{{~ if table.value_ttype.is_bean ~}}
{{deserialize_row "row" "x" table.value_ttype}}
{{~else~}}
let row: {{value_type}} = std::sync::Arc::new(serde_json::from_value(x.clone()).unwrap());
{{~end~}}
data_list.push(row.clone());
}
{{~if table.is_union_index~}}
let mut data_map_union: {{table_union_map_type_name}} = Default::default();
for x in &data_list {
data_map_union.insert(({{table_key_list "x"}}.clone()), x.clone());
}
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
let mut data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.index_field.ctype}}, {{value_type}}> = Default::default();
{{~end~}}
for x in &data_list {
{{~for idx in table.index_list~}}
data_map_{{idx.index_field.name}}.insert(x.{{format_property_name __code_style idx.index_field.name}}.clone(), x.clone());
{{~end~}}
}
{{~end~}}
Ok(std::sync::Arc::new({{table.name}} {
data_list,
{{~if table.is_union_index~}}
data_map_union,
{{~else if !table.index_list.empty?~}}
{{~for idx in table.index_list~}}
data_map_{{idx.index_field.name}},
{{~end~}}
{{~end~}}
}))
}
{{~if table.is_union_index~}}
pub fn get(&self, key: &({{array.each table.index_list @index_type_name | array.join ', '}})) -> Option<{{value_type}}> {
self.data_map_union.get(key).map(|x| x.clone())
}
{{~else if !table.index_list.empty? ~}}
{{~for idx in table.index_list
index = format_property_name __code_style idx.index_field.name
~}}
pub fn get_by_{{index}}(&self, key: &{{declaring_type_name idx.type}}) -> Option<{{value_type}}> {
self.data_map_{{index}}.get(key).map(|x| x.clone())
}
{{~end~}}
{{~end~}}
}
{{~else~}}
impl {{name}} {
pub fn new(json: &serde_json::Value) -> Result<std::sync::Arc<{{name}}>, LubanError> {
let json = json.as_array().unwrap();
let n = json.len();
if n != 1 { return Err(LubanError::Table(format!("table mode=one, but size != 1"))); }
let data = {{full_name table.value_ttype.def_bean}}::new(&json[0])?;
Ok(std::sync::Arc::new({{name}} { data }))
}
}
{{~end~}}
{{~end~}}

View File

@@ -0,0 +1,12 @@
[package]
name = "{{__name}}"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde = { version = "1.0.x", features = ["derive"] }
serde_json = "1.0.x"
bitflags = { version = "2.5.x" , features = ["serde"]}
macros = {path = "../macros"}

View File

@@ -0,0 +1,234 @@
import ByteBuf from '../luban/ByteBuf'
{{~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 ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'for (let [_, _e] of ' + 'this.' + 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(_buf_: ByteBuf): {{bean.name}}{
switch (_buf_.readInt()) {
{{~ for child in bean.hierarchy_not_abstract_children~}}
case {{child.id}}: return new {{child.full_name}}(_buf_)
{{~end~}}
default: throw new Error()
}
}
{{~end~}}
constructor(_buf_: ByteBuf) {
{{~if bean.parent_def_type~}}
super(_buf_)
{{~end~}}
{{~ for field in bean.export_fields ~}}
{{deserialize ('this.' + format_field_name __code_style field.name) '_buf_' 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 ~}}
{{generate_resolve_field_ref field}}
{{~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(_buf_: ByteBuf) {
this._dataMap = new Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>()
this._dataList = []
for(let n = _buf_.readInt(); n > 0; n--) {
let _v: {{declaring_type_name value_type}}
{{deserialize '_v' '_buf_' 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(_buf_: ByteBuf) {
this._dataList = []
for(let n = _buf_.readInt(); n > 0; n--) {
let _v: {{declaring_type_name value_type}}
{{deserialize '_v' '_buf_' 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(_buf_: ByteBuf) {
if (_buf_.readInt() != 1) throw new Error('table mode=one, but size != 1')
{{deserialize 'this._data' '_buf_' 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 ByteBufLoader = (file: string) => ByteBuf
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~}}
static getTableNames(): string[] {
let names: string[] = [];
{{~for table in __tables ~}}
names.push('{{table.output_data_file}}');
{{~end~}}
return names;
}
constructor(loader: ByteBufLoader) {
{{~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~}}
}
}

View File

@@ -0,0 +1,226 @@
{{~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 ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
else if (is_field_map_need_resolve_ref field)
ret 'for (let [_, _e] of ' + 'this.' + 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 ~}}
{{generate_resolve_field_ref field}}
{{~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~}}
}
}

View File

@@ -0,0 +1,31 @@
import pb from 'pb';
type BufLoader = (file: string) => Uint8Array;
export class {{__name}} {
{{~ for table in __tables ~}}
private _{{table.name}}: pb.cfg.{{table.name}}
{{~if table.comment != '' ~}}
/**
* {{escape_comment table.comment}}
*/
{{~end~}}
get {{table.name}}(): pb.cfg.{{table.name}} { return this._{{table.name}};}
{{~end~}}
static getTableNames(): string[] {
let names: string[] = [];
{{~for table in __tables ~}}
names.push('{{table.output_data_file}}');
{{~end~}}
return names;
}
constructor(loader: BufLoader) {
let buffer: Uint8Array;
{{~for table in __tables ~}}
buffer = loader('{{table.output_data_file}}');
this._{{table.name}} = pb.cfg.{{table.name}}.decode(buffer, buffer.length);
{{~end~}}
}
}