初始化工程
This commit is contained in:
23
Config/Tools/Luban/Templates/common/cpp/enum.sbn
Normal file
23
Config/Tools/Luban/Templates/common/cpp/enum.sbn
Normal 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}}
|
||||
28
Config/Tools/Luban/Templates/common/cs/enum.sbn
Normal file
28
Config/Tools/Luban/Templates/common/cs/enum.sbn
Normal 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}}
|
||||
30
Config/Tools/Luban/Templates/common/dart/enum.sbn
Normal file
30
Config/Tools/Luban/Templates/common/dart/enum.sbn
Normal 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));
|
||||
}
|
||||
}
|
||||
19
Config/Tools/Luban/Templates/common/go/enum.sbn
Normal file
19
Config/Tools/Luban/Templates/common/go/enum.sbn
Normal 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~}}
|
||||
)
|
||||
19
Config/Tools/Luban/Templates/common/java/enum.sbn
Normal file
19
Config/Tools/Luban/Templates/common/java/enum.sbn
Normal 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~}}
|
||||
}
|
||||
2
Config/Tools/Luban/Templates/common/php/enum.sbn
Normal file
2
Config/Tools/Luban/Templates/common/php/enum.sbn
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
14
Config/Tools/Luban/Templates/common/rs/macros/Cargo.toml.sbn
Normal file
14
Config/Tools/Luban/Templates/common/rs/macros/Cargo.toml.sbn
Normal 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
|
||||
65
Config/Tools/Luban/Templates/common/rs/macros/src/lib.rs.sbn
Normal file
65
Config/Tools/Luban/Templates/common/rs/macros/src/lib.rs.sbn
Normal 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()
|
||||
}
|
||||
2
Config/Tools/Luban/Templates/common/ts/enum.sbn
Normal file
2
Config/Tools/Luban/Templates/common/ts/enum.sbn
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
32
Config/Tools/Luban/Templates/cpp-rawptr-bin/bean.sbn
Normal file
32
Config/Tools/Luban/Templates/cpp-rawptr-bin/bean.sbn
Normal 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}}
|
||||
45
Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_cpp.sbn
Normal file
45
Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_cpp.sbn
Normal 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}}
|
||||
21
Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_h.sbn
Normal file
21
Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_h.sbn
Normal 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}}
|
||||
134
Config/Tools/Luban/Templates/cpp-rawptr-bin/table.sbn
Normal file
134
Config/Tools/Luban/Templates/cpp-rawptr-bin/table.sbn
Normal 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}}
|
||||
23
Config/Tools/Luban/Templates/cpp-rawptr-bin/tables.sbn
Normal file
23
Config/Tools/Luban/Templates/cpp-rawptr-bin/tables.sbn
Normal 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;
|
||||
}
|
||||
};
|
||||
32
Config/Tools/Luban/Templates/cpp-sharedptr-bin/bean.sbn
Normal file
32
Config/Tools/Luban/Templates/cpp-sharedptr-bin/bean.sbn
Normal 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}}
|
||||
@@ -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}}
|
||||
21
Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_h.sbn
Normal file
21
Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_h.sbn
Normal 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}}
|
||||
140
Config/Tools/Luban/Templates/cpp-sharedptr-bin/table.sbn
Normal file
140
Config/Tools/Luban/Templates/cpp-sharedptr-bin/table.sbn
Normal 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}}
|
||||
23
Config/Tools/Luban/Templates/cpp-sharedptr-bin/tables.sbn
Normal file
23
Config/Tools/Luban/Templates/cpp-sharedptr-bin/tables.sbn
Normal 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;
|
||||
}
|
||||
};
|
||||
150
Config/Tools/Luban/Templates/cs-bin/bean.sbn
Normal file
150
Config/Tools/Luban/Templates/cs-bin/bean.sbn
Normal 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}}
|
||||
169
Config/Tools/Luban/Templates/cs-bin/table.sbn
Normal file
169
Config/Tools/Luban/Templates/cs-bin/table.sbn
Normal 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}}
|
||||
31
Config/Tools/Luban/Templates/cs-bin/tables.sbn
Normal file
31
Config/Tools/Luban/Templates/cs-bin/tables.sbn
Normal 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}}
|
||||
151
Config/Tools/Luban/Templates/cs-dotnet-json/bean.sbn
Normal file
151
Config/Tools/Luban/Templates/cs-dotnet-json/bean.sbn
Normal 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}}
|
||||
170
Config/Tools/Luban/Templates/cs-dotnet-json/table.sbn
Normal file
170
Config/Tools/Luban/Templates/cs-dotnet-json/table.sbn
Normal 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}}
|
||||
32
Config/Tools/Luban/Templates/cs-dotnet-json/tables.sbn
Normal file
32
Config/Tools/Luban/Templates/cs-dotnet-json/tables.sbn
Normal 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}}
|
||||
101
Config/Tools/Luban/Templates/cs-editor-json/bean.sbn
Normal file
101
Config/Tools/Luban/Templates/cs-editor-json/bean.sbn
Normal 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}}
|
||||
59
Config/Tools/Luban/Templates/cs-editor-json/enum.sbn
Normal file
59
Config/Tools/Luban/Templates/cs-editor-json/enum.sbn
Normal 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}}
|
||||
158
Config/Tools/Luban/Templates/cs-newtonsoft-json/bean.sbn
Normal file
158
Config/Tools/Luban/Templates/cs-newtonsoft-json/bean.sbn
Normal 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}}
|
||||
177
Config/Tools/Luban/Templates/cs-newtonsoft-json/table.sbn
Normal file
177
Config/Tools/Luban/Templates/cs-newtonsoft-json/table.sbn
Normal 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}}
|
||||
32
Config/Tools/Luban/Templates/cs-newtonsoft-json/tables.sbn
Normal file
32
Config/Tools/Luban/Templates/cs-newtonsoft-json/tables.sbn
Normal 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}}
|
||||
151
Config/Tools/Luban/Templates/cs-simple-json/bean.sbn
Normal file
151
Config/Tools/Luban/Templates/cs-simple-json/bean.sbn
Normal 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}}
|
||||
170
Config/Tools/Luban/Templates/cs-simple-json/table.sbn
Normal file
170
Config/Tools/Luban/Templates/cs-simple-json/table.sbn
Normal 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}}
|
||||
32
Config/Tools/Luban/Templates/cs-simple-json/tables.sbn
Normal file
32
Config/Tools/Luban/Templates/cs-simple-json/tables.sbn
Normal 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}}
|
||||
32
Config/Tools/Luban/Templates/cs_pb/tables.sbn
Normal file
32
Config/Tools/Luban/Templates/cs_pb/tables.sbn
Normal 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}}
|
||||
143
Config/Tools/Luban/Templates/dart-json/bean.sbn
Normal file
143
Config/Tools/Luban/Templates/dart-json/bean.sbn
Normal 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}})';
|
||||
}
|
||||
}
|
||||
145
Config/Tools/Luban/Templates/dart-json/table.sbn
Normal file
145
Config/Tools/Luban/Templates/dart-json/table.sbn
Normal 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~}}
|
||||
}
|
||||
43
Config/Tools/Luban/Templates/dart-json/tables.sbn
Normal file
43
Config/Tools/Luban/Templates/dart-json/tables.sbn
Normal 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~}}
|
||||
}
|
||||
|
||||
}
|
||||
51
Config/Tools/Luban/Templates/flatbuffers/schema.sbn
Normal file
51
Config/Tools/Luban/Templates/flatbuffers/schema.sbn
Normal 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~}}
|
||||
|
||||
167
Config/Tools/Luban/Templates/gdscript-json/schema.sbn
Normal file
167
Config/Tools/Luban/Templates/gdscript-json/schema.sbn
Normal 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~}}
|
||||
54
Config/Tools/Luban/Templates/go-bin/bean.sbn
Normal file
54
Config/Tools/Luban/Templates/go-bin/bean.sbn
Normal 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~}}
|
||||
116
Config/Tools/Luban/Templates/go-bin/table.sbn
Normal file
116
Config/Tools/Luban/Templates/go-bin/table.sbn
Normal 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~}}
|
||||
33
Config/Tools/Luban/Templates/go-bin/tables.sbn
Normal file
33
Config/Tools/Luban/Templates/go-bin/tables.sbn
Normal 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
|
||||
}
|
||||
|
||||
50
Config/Tools/Luban/Templates/go-json/bean.sbn
Normal file
50
Config/Tools/Luban/Templates/go-json/bean.sbn
Normal 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~}}
|
||||
103
Config/Tools/Luban/Templates/go-json/table.sbn
Normal file
103
Config/Tools/Luban/Templates/go-json/table.sbn
Normal 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~}}
|
||||
28
Config/Tools/Luban/Templates/go-json/tables.sbn
Normal file
28
Config/Tools/Luban/Templates/go-json/tables.sbn
Normal 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
|
||||
}
|
||||
|
||||
65
Config/Tools/Luban/Templates/java-bin/bean.sbn
Normal file
65
Config/Tools/Luban/Templates/java-bin/bean.sbn
Normal 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~}}
|
||||
+ "}";
|
||||
}
|
||||
}
|
||||
81
Config/Tools/Luban/Templates/java-bin/table.sbn
Normal file
81
Config/Tools/Luban/Templates/java-bin/table.sbn
Normal 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~}}
|
||||
}
|
||||
37
Config/Tools/Luban/Templates/java-bin/tables.sbn
Normal file
37
Config/Tools/Luban/Templates/java-bin/tables.sbn
Normal 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~}}
|
||||
}
|
||||
}
|
||||
67
Config/Tools/Luban/Templates/java-json/bean.sbn
Normal file
67
Config/Tools/Luban/Templates/java-json/bean.sbn
Normal 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~}}
|
||||
+ "}";
|
||||
}
|
||||
}
|
||||
82
Config/Tools/Luban/Templates/java-json/table.sbn
Normal file
82
Config/Tools/Luban/Templates/java-json/table.sbn
Normal 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~}}
|
||||
}
|
||||
39
Config/Tools/Luban/Templates/java-json/tables.sbn
Normal file
39
Config/Tools/Luban/Templates/java-json/tables.sbn
Normal 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~}}
|
||||
}
|
||||
}
|
||||
158
Config/Tools/Luban/Templates/lua-bin/schema.sbn
Normal file
158
Config/Tools/Luban/Templates/lua-bin/schema.sbn
Normal 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 }
|
||||
|
||||
42
Config/Tools/Luban/Templates/lua-lua/schema.sbn
Normal file
42
Config/Tools/Luban/Templates/lua-lua/schema.sbn
Normal 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 }
|
||||
41
Config/Tools/Luban/Templates/pb/schema.sbn
Normal file
41
Config/Tools/Luban/Templates/pb/schema.sbn
Normal 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~}}
|
||||
|
||||
155
Config/Tools/Luban/Templates/php-json/schema.sbn
Normal file
155
Config/Tools/Luban/Templates/php-json/schema.sbn
Normal 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~}}
|
||||
156
Config/Tools/Luban/Templates/python-json/schema.sbn
Normal file
156
Config/Tools/Luban/Templates/python-json/schema.sbn
Normal 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~}}
|
||||
51
Config/Tools/Luban/Templates/rust-bin/lib.sbn
Normal file
51
Config/Tools/Luban/Templates/rust-bin/lib.sbn
Normal 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~}}
|
||||
})
|
||||
}
|
||||
}
|
||||
280
Config/Tools/Luban/Templates/rust-bin/mod.sbn
Normal file
280
Config/Tools/Luban/Templates/rust-bin/mod.sbn
Normal 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~}}
|
||||
11
Config/Tools/Luban/Templates/rust-bin/toml.sbn
Normal file
11
Config/Tools/Luban/Templates/rust-bin/toml.sbn
Normal 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" }
|
||||
51
Config/Tools/Luban/Templates/rust-json/lib.sbn
Normal file
51
Config/Tools/Luban/Templates/rust-json/lib.sbn
Normal 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~}}
|
||||
})
|
||||
}
|
||||
}
|
||||
287
Config/Tools/Luban/Templates/rust-json/mod.sbn
Normal file
287
Config/Tools/Luban/Templates/rust-json/mod.sbn
Normal 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~}}
|
||||
12
Config/Tools/Luban/Templates/rust-json/toml.sbn
Normal file
12
Config/Tools/Luban/Templates/rust-json/toml.sbn
Normal 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"}
|
||||
234
Config/Tools/Luban/Templates/typescript-bin/schema.sbn
Normal file
234
Config/Tools/Luban/Templates/typescript-bin/schema.sbn
Normal 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~}}
|
||||
}
|
||||
}
|
||||
226
Config/Tools/Luban/Templates/typescript-json/schema.sbn
Normal file
226
Config/Tools/Luban/Templates/typescript-json/schema.sbn
Normal 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~}}
|
||||
}
|
||||
}
|
||||
31
Config/Tools/Luban/Templates/typescript-protobuf/schema.sbn
Normal file
31
Config/Tools/Luban/Templates/typescript-protobuf/schema.sbn
Normal 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~}}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user