| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- {{~ 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~}}
|