From 0e872b56100e411de11a49412742d9108ace2063 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 31 Jul 2021 18:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91cfg=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20cs=5Fcode=5Funity=5Fjson=20=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=94=9F=E6=88=90=E6=94=AF=E6=8C=81=E3=80=82=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20SimpleJSON=20=E3=80=82=20=E3=80=90?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E3=80=91=E7=95=A5=E5=BE=AE=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BA=86=20code=5Fcode=5Fjson=E7=94=9F=E6=88=90(=E4=B8=BB?= =?UTF-8?q?=E8=A6=81=E6=98=AF=E5=B0=86=5Fbuf=E6=94=B9=E5=90=8D=E4=B8=BA=5F?= =?UTF-8?q?json)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/images/examples/ex_01.png | Bin 55696 -> 45226 bytes .../Source/Defs/TTypeTemplateExtends.cs | 16 +- .../Source/Generate/CsCodeJsonRender.cs | 22 +- .../Source/Generate/CsCodeUnityJsonRender.cs | 279 ++++++++++++++++++ src/Luban.Job.Cfg/Source/JobController.cs | 8 +- ...CsJsonUmarshal.cs => CsJsonDeserialize.cs} | 18 +- .../TypeVisitors/CsJsonUnityDeserialize.cs | 133 +++++++++ 7 files changed, 452 insertions(+), 24 deletions(-) create mode 100644 src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs rename src/Luban.Job.Cfg/Source/TypeVisitors/{CsJsonUmarshal.cs => CsJsonDeserialize.cs} (55%) create mode 100644 src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUnityDeserialize.cs diff --git a/docs/images/examples/ex_01.png b/docs/images/examples/ex_01.png index a8d810ad07b5f8e23ece3b6bcb3f1db3d71b955a..9ad5ebc5b47f0cef2b0d8a7fd186dcc19db6023b 100644 GIT binary patch literal 45226 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≀ZmjQ~GW$mr$*qOq`|EIZlj{U# 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 Lf@H=u1J8c|pH<@3 literal 55696 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%0DNfAm9|NFASQ-fipm(&dwMA@{FI!*=2ViwX7F;z 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 E0Bg^L?EnA( diff --git a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs index f90f001..b2293ad 100644 --- a/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs +++ b/src/Luban.Job.Cfg/Source/Defs/TTypeTemplateExtends.cs @@ -12,11 +12,23 @@ namespace Luban.Job.Cfg.Defs { if (type.IsNullable) { - return $"{{ var _j = {bufName}.GetProperty(\"{jsonFieldName}\"); if (_j.ValueKind != JsonValueKind.Null) {{ {type.Apply(CsJsonUserialize.Ins, "_j", fieldName)} }} else {{ {fieldName} = null; }} }}"; + return $"{{ var _j = {bufName}.GetProperty(\"{jsonFieldName}\"); if (_j.ValueKind != JsonValueKind.Null) {{ {type.Apply(TypeVisitors.CsJsonDeserialize.Ins, "_j", fieldName)} }} else {{ {fieldName} = null; }} }}"; } else { - return type.Apply(CsJsonUserialize.Ins, $"{bufName}.GetProperty(\"{jsonFieldName}\")", fieldName); + return type.Apply(TypeVisitors.CsJsonDeserialize.Ins, $"{bufName}.GetProperty(\"{jsonFieldName}\")", fieldName); + } + } + + public static string CsUnityJsonDeserialize(string bufName, string fieldName, string jsonFieldName, TType type) + { + if (type.IsNullable) + { + return $"{{ var _j = {bufName}[\"{jsonFieldName}\"]; if (_j.Tag != JSONNodeType.None && _j.Tag != JSONNodeType.NullValue) {{ {type.Apply(TypeVisitors.CsUnityJsonDeserialize.Ins, "_j", fieldName)} }} else {{ {fieldName} = null; }} }}"; + } + else + { + return type.Apply(TypeVisitors.CsUnityJsonDeserialize.Ins, $"{bufName}[\"{jsonFieldName}\"]", fieldName); } } diff --git a/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs index 07ce7e8..b874f56 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsCodeJsonRender.cs @@ -32,10 +32,10 @@ namespace {{x.namespace_with_top_module}} /// public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} {{parent}} {{else}} Bright.Config.BeanBase {{end}} { - public {{name}}(JsonElement _buf) {{if parent_def_type}} : base(_buf) {{end}} + public {{name}}(JsonElement _json) {{if parent_def_type}} : base(_json) {{end}} { {{~ for field in export_fields ~}} - {{cs_json_deserialize '_buf' field.cs_style_name field.name field.ctype}} + {{cs_json_deserialize '_json' field.cs_style_name field.name field.ctype}} {{~if field.index_field~}} foreach(var _v in {{field.cs_style_name}}) { {{field.cs_style_name}}_Index.Add(_v.{{field.index_field.cs_style_name}}, _v); } {{~end~}} @@ -52,18 +52,18 @@ public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} { {{~end~}} } - public static {{name}} Deserialize{{name}}(JsonElement _buf) + public static {{name}} Deserialize{{name}}(JsonElement _json) { {{~if x.is_abstract_type~}} - switch (_buf.GetProperty(""__type__"").GetString()) + switch (_json.GetProperty(""__type__"").GetString()) { {{~for child in x.hierarchy_not_abstract_children~}} - case ""{{child.name}}"": return new {{child.full_name}}(_buf); + case ""{{child.name}}"": return new {{child.full_name}}(_json); {{~end~}} default: throw new SerializationException(); } {{~else~}} - return new {{x.full_name}}(_buf); + return new {{x.full_name}}(_json); {{~end~}} } @@ -148,12 +148,12 @@ public sealed partial class {{name}} private readonly Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> _dataMap; private readonly List<{{cs_define_type value_type}}> _dataList; - public {{name}}(JsonElement _buf) + public {{name}}(JsonElement _json) { _dataMap = new Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}>(); _dataList = new List<{{cs_define_type value_type}}>(); - foreach(JsonElement _row in _buf.EnumerateArray()) + foreach(JsonElement _row in _json.EnumerateArray()) { var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row); _dataList.Add(_v); @@ -185,11 +185,11 @@ public sealed partial class {{name}} private readonly {{cs_define_type value_type}} _data; - public {{name}}(JsonElement _buf) + public {{name}}(JsonElement _json) { - int n = _buf.GetArrayLength(); + int n = _json.GetArrayLength(); if (n != 1) throw new SerializationException(""table mode=one, but size != 1""); - _data = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_buf[0]); + _data = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_json[0]); } {{~ for field in value_type.bean.hierarchy_export_fields ~}} diff --git a/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs new file mode 100644 index 0000000..adb06ad --- /dev/null +++ b/src/Luban.Job.Cfg/Source/Generate/CsCodeUnityJsonRender.cs @@ -0,0 +1,279 @@ +using Luban.Job.Cfg.Defs; +using Scriban; +using System; +using System.Collections.Generic; + +namespace Luban.Job.Cfg.Generate +{ + class CsCodeUnityJsonRender : CsCodeRenderBase + { + [ThreadStatic] + private static Template t_beanRender; + public override string Render(DefBean b) + { + var template = t_beanRender ??= Template.Parse(@" +using Bright.Serialization; +using System.Collections.Generic; +using SimpleJSON; + +{{ + name = x.name + parent_def_type = x.parent_def_type + parent = x.parent + export_fields = x.export_fields + hierarchy_export_fields = x.hierarchy_export_fields +}} + +namespace {{x.namespace_with_top_module}} +{ + +/// +/// {{x.comment}} +/// +public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} {{parent}} {{else}} Bright.Config.BeanBase {{end}} +{ + public {{name}}(JSONNode _json) {{if parent_def_type}} : base(_json) {{end}} + { + {{~ for field in export_fields ~}} + {{cs_unity_json_deserialize '_json' field.cs_style_name field.name field.ctype}} + {{~if field.index_field~}} + foreach(var _v in {{field.cs_style_name}}) { {{field.cs_style_name}}_Index.Add(_v.{{field.index_field.cs_style_name}}, _v); } + {{~end~}} + {{~end~}} + } + + public {{name}}({{~for field in hierarchy_export_fields }}{{cs_define_type field.ctype}} {{field.name}}{{if !for.last}},{{end}} {{end}}) {{if parent_def_type}} : base({{- for field in parent_def_type.hierarchy_export_fields }}{{field.name}}{{if !for.last}},{{end}}{{end}}) {{end}} + { + {{~ for field in export_fields ~}} + this.{{field.cs_style_name}} = {{field.name}}; + {{~if field.index_field~}} + foreach(var _v in {{field.cs_style_name}}) { {{field.cs_style_name}}_Index.Add(_v.{{field.index_field.cs_style_name}}, _v); } + {{~end~}} + {{~end~}} + } + + public static {{name}} Deserialize{{name}}(JSONNode _json) + { + {{~if x.is_abstract_type~}} + string type = _json[""__type__""]; + switch (type) + { + {{~for child in x.hierarchy_not_abstract_children~}} + case ""{{child.name}}"": return new {{child.full_name}}(_json); + {{~end~}} + default: throw new SerializationException(); + } + {{~else~}} + return new {{x.full_name}}(_json); + {{~end~}} + } + + {{~ for field in export_fields ~}} + /// + /// {{field.comment}} + /// + public readonly {{cs_define_type field.ctype}} {{field.cs_style_name}}; + {{~if field.index_field~}} + public readonly Dictionary<{{cs_define_type field.index_field.ctype}}, {{cs_define_type field.ctype.element_type}}> {{field.cs_style_name}}_Index = new Dictionary<{{cs_define_type field.index_field.ctype}}, {{cs_define_type field.ctype.element_type}}>(); + {{~end~}} + {{~if field.gen_ref~}} + public {{field.cs_ref_validator_define}} + {{~end~}} + {{~end~}} + +{{~if !x.is_abstract_type~}} + public const int ID = {{x.id}}; + public override int GetTypeId() => ID; +{{~end~}} + + public {{x.cs_method_modifier}} void Resolve(Dictionary _tables) + { + {{~if parent_def_type~}} + base.Resolve(_tables); + {{~end~}} + {{~ for field in export_fields ~}} + {{~if field.gen_ref~}} + {{cs_ref_validator_resolve field}} + {{~else if field.has_recursive_ref~}} + {{cs_recursive_resolve field '_tables'}} + {{~end~}} + {{~end~}} + OnResolveFinish(_tables); + } + + partial void OnResolveFinish(Dictionary _tables); + + public override string ToString() + { + return ""{{full_name}}{ "" + {{~ for field in hierarchy_export_fields ~}} + + ""{{field.cs_style_name}}:"" + {{cs_to_string field.cs_style_name field.ctype}} + "","" + {{~end~}} + + ""}""; + } + } +} + +"); + var result = template.RenderCode(b); + + return result; + } + + [ThreadStatic] + private static Template t_tableRender; + public override string Render(DefTable p) + { + var template = t_tableRender ??= Template.Parse(@" +using Bright.Serialization; +using System.Collections.Generic; +using SimpleJSON; + +{{ + name = x.name + key_type = x.key_ttype + key_type1 = x.key_ttype1 + key_type2 = x.key_ttype2 + value_type = x.value_ttype +}} + +namespace {{x.namespace_with_top_module}} +{ + +/// +/// {{x.comment}} +/// +public sealed partial class {{name}} +{ + {{~if x.is_map_table ~}} + private readonly Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> _dataMap; + private readonly List<{{cs_define_type value_type}}> _dataList; + + public {{name}}(JSONNode _json) + { + _dataMap = new Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}>(); + _dataList = new List<{{cs_define_type value_type}}>(); + + foreach(JSONNode _row in _json.Children) + { + var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row); + _dataList.Add(_v); + _dataMap.Add(_v.{{x.index_field.cs_style_name}}, _v); + } + } + + public Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> DataMap => _dataMap; + public List<{{cs_define_type value_type}}> DataList => _dataList; + +{{~if value_type.is_dynamic~}} + public T GetOrDefaultAs({{cs_define_type key_type}} key) where T : {{cs_define_type value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null; + public T GetAs({{cs_define_type key_type}} key) where T : {{cs_define_type value_type}} => (T)_dataMap[key]; +{{~end~}} + public {{cs_define_type value_type}} GetOrDefault({{cs_define_type key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null; + public {{cs_define_type value_type}} Get({{cs_define_type key_type}} key) => _dataMap[key]; + public {{cs_define_type value_type}} this[{{cs_define_type key_type}} key] => _dataMap[key]; + + public void Resolve(Dictionary _tables) + { + foreach(var v in _dataList) + { + v.Resolve(_tables); + } + OnResolveFinish(_tables); + } + + {{~else~}} + + private readonly {{cs_define_type value_type}} _data; + + public {{name}}(JSONNode _json) + { + if(!_json.IsArray) + { + throw new SerializationException(); + } + if (_json.Count != 1) throw new SerializationException(""table mode=one, but size != 1""); + _data = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_json[0]); + } + + {{~ for field in value_type.bean.hierarchy_export_fields ~}} + /// + /// {{field.comment}} + /// + public {{cs_define_type field.ctype}} {{field.cs_style_name}} => _data.{{field.cs_style_name}}; + {{~if field.ref~}} + public {{field.cs_ref_type_name}} {{field.cs_ref_var_name}} => _data.{{field.cs_ref_var_name}}; + {{~end~}} + {{~end~}} + + public void Resolve(Dictionary _tables) + { + _data.Resolve(_tables); + OnResolveFinish(_tables); + } + + {{~end~}} + + partial void OnResolveFinish(Dictionary _tables); +} + +} +"); + var result = template.RenderCode(p); + + return result; + } + + + [ThreadStatic] + private static Template t_serviceRender; + public override string RenderService(string name, string module, List tables) + { + var template = t_serviceRender ??= Template.Parse(@" +using Bright.Serialization; +using SimpleJSON; +{{ + name = x.name + namespace = x.namespace + tables = x.tables +}} +namespace {{namespace}} +{ + +public sealed partial class {{name}} +{ + {{~for table in tables ~}} + /// + /// {{table.comment}} + /// + public {{table.full_name}} {{table.name}} {get; } + {{~end~}} + + public {{name}}(System.Func loader) + { + var tables = new System.Collections.Generic.Dictionary(); + {{~for table in tables ~}} + {{table.name}} = new {{table.full_name}}(loader(""{{table.output_data_file}}"")); + tables.Add(""{{table.full_name}}"", {{table.name}}); + {{~end~}} + + {{~for table in tables ~}} + {{table.name}}.Resolve(tables); + {{~end~}} + } +} + +} + +"); + var result = template.RenderCode(new + { + Name = name, + Namespace = module, + Tables = tables, + }); + + return result; + } + } +} diff --git a/src/Luban.Job.Cfg/Source/JobController.cs b/src/Luban.Job.Cfg/Source/JobController.cs index 75a8d5d..1717536 100644 --- a/src/Luban.Job.Cfg/Source/JobController.cs +++ b/src/Luban.Job.Cfg/Source/JobController.cs @@ -45,7 +45,7 @@ namespace Luban.Job.Cfg [Option("output_data_json_monolithic_file", Required = false, HelpText = "output monolithic json file")] public string OutputDataJsonMonolithicFile { get; set; } - [Option("gen_types", Required = true, HelpText = "code_cs_bin,code_cs_json,code_lua_bin,code_java_bin,code_go_bin,code_go_json,code_cpp_bin,code_python27_json,code_python3_json,code_typescript_bin,code_typescript_json,data_bin,data_lua,data_json,data_json_monolithic . can be multi")] + [Option("gen_types", Required = true, HelpText = "code_cs_bin,code_cs_json,code_cs_unity_json,code_lua_bin,code_java_bin,code_go_bin,code_go_json,code_cpp_bin,code_python27_json,code_python3_json,code_typescript_bin,code_typescript_json,data_bin,data_lua,data_json,data_json_monolithic . can be multi")] public string GenType { get; set; } [Option('s', "service", Required = true, HelpText = "service")] @@ -79,6 +79,7 @@ namespace Luban.Job.Cfg { case "code_cs_bin": return new CsCodeBinRender(); case "code_cs_json": return new CsCodeJsonRender(); + case "code_cs_unity_json": return new CsCodeUnityJsonRender(); case "code_java_bin": return new JavaCodeBinRender(); case "code_go_bin": return new GoCodeBinRender(); case "code_go_json": return new GoCodeJsonRender(); @@ -101,7 +102,9 @@ namespace Luban.Job.Cfg switch (genType) { case "code_cs_bin": - case "code_cs_json": return ELanguage.CS; + case "code_cs_json": + case "code_cs_unity_json": + return ELanguage.CS; case "code_java_bin": return ELanguage.JAVA; case "code_go_bin": case "code_go_json": return ELanguage.GO; @@ -329,6 +332,7 @@ namespace Luban.Job.Cfg { case "code_cs_bin": case "code_cs_json": + case "code_cs_unity_json": case "code_java_bin": case "code_go_bin": case "code_go_json": diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUmarshal.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonDeserialize.cs similarity index 55% rename from src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUmarshal.cs rename to src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonDeserialize.cs index bdc2912..616e441 100644 --- a/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUmarshal.cs +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonDeserialize.cs @@ -4,9 +4,9 @@ using System; namespace Luban.Job.Cfg.TypeVisitors { - class CsJsonUserialize : ITypeFuncVisitor + class CsJsonDeserialize : ITypeFuncVisitor { - public static CsJsonUserialize Ins { get; } = new CsJsonUserialize(); + public static CsJsonDeserialize Ins { get; } = new(); public string Accept(TBool type, string json, string x) { @@ -85,37 +85,37 @@ namespace Luban.Job.Cfg.TypeVisitors public string Accept(TArray type, string json, string x) { - return $"{{ var _json = {json}; int _n = _json.GetArrayLength(); {x} = new {type.ElementType.CsUnderingDefineType()}[_n]; int _index=0; foreach(JsonElement __e in _json.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}[_index++] = __v; }} }}"; + return $"{{ var _json0 = {json}; int _n = _json0.GetArrayLength(); {x} = new {type.ElementType.CsUnderingDefineType()}[_n]; int _index=0; foreach(JsonElement __e in _json0.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}[_index++] = __v; }} }}"; } public string Accept(TList type, string json, string x) { - return $"{{ var _json = {json}; {x} = new {type.CsUnderingDefineType()}(_json.GetArrayLength()); foreach(JsonElement __e in _json.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; + return $"{{ var _json0 = {json}; {x} = new {type.CsUnderingDefineType()}(_json0.GetArrayLength()); foreach(JsonElement __e in _json0.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; } public string Accept(TSet type, string json, string x) { - return $"{{ var _json = {json}; {x} = new {type.CsUnderingDefineType()}(_json.GetArrayLength()); foreach(JsonElement __e in _json.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; + return $"{{ var _json0 = {json}; {x} = new {type.CsUnderingDefineType()}(_json0.GetArrayLength()); foreach(JsonElement __e in _json0.EnumerateArray()) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; } public string Accept(TMap type, string json, string x) { - return @$"{{ var _json = {json}; {x} = new {type.CsUnderingDefineType()}(_json.GetArrayLength()); foreach(JsonElement __e in _json.EnumerateArray()) {{ {type.KeyType.CsUnderingDefineType()} __k; {type.KeyType.Apply(this, "__e[0]", "__k")} {type.ValueType.CsUnderingDefineType()} __v; {type.ValueType.Apply(this, "__e[1]", "__v")} {x}.Add(__k, __v); }} }}"; + return @$"{{ var _json0 = {json}; {x} = new {type.CsUnderingDefineType()}(_json0.GetArrayLength()); foreach(JsonElement __e in _json0.EnumerateArray()) {{ {type.KeyType.CsUnderingDefineType()} __k; {type.KeyType.Apply(this, "__e[0]", "__k")} {type.ValueType.CsUnderingDefineType()} __v; {type.ValueType.Apply(this, "__e[1]", "__v")} {x}.Add(__k, __v); }} }}"; } public string Accept(TVector2 type, string json, string x) { - return $"{{ var _json = {json}; float __x; {TFloat.Ins.Apply(this, "_json.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json.GetProperty(\"y\")", "__y") } {x} = new System.Numerics.Vector2(__x, __y); }}"; + return $"{{ var _json0 = {json}; float __x; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"y\")", "__y") } {x} = new System.Numerics.Vector2(__x, __y); }}"; } public string Accept(TVector3 type, string json, string x) { - return $"{{ var _json = {json}; float __x; {TFloat.Ins.Apply(this, "_json.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json.GetProperty(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json.GetProperty(\"z\")", "__z") } {x} = new System.Numerics.Vector3(__x, __y,__z); }}"; + return $"{{ var _json0 = {json}; float __x; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"z\")", "__z") } {x} = new System.Numerics.Vector3(__x, __y,__z); }}"; } public string Accept(TVector4 type, string json, string x) { - return $"{{ var _json = {json}; float __x; {TFloat.Ins.Apply(this, "_json.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json.GetProperty(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json.GetProperty(\"z\")", "__z") } float __w; {TFloat.Ins.Apply(this, "_json.GetProperty(\"w\")", "__w") } {x} = new System.Numerics.Vector4(__x, __y, __z, __w); }}"; + return $"{{ var _json0 = {json}; float __x; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"x\")", "__x") } float __y; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"y\")", "__y") } float __z; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"z\")", "__z") } float __w; {TFloat.Ins.Apply(this, "_json0.GetProperty(\"w\")", "__w") } {x} = new System.Numerics.Vector4(__x, __y, __z, __w); }}"; } public string Accept(TDateTime type, string json, string x) diff --git a/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUnityDeserialize.cs b/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUnityDeserialize.cs new file mode 100644 index 0000000..e3b94a2 --- /dev/null +++ b/src/Luban.Job.Cfg/Source/TypeVisitors/CsJsonUnityDeserialize.cs @@ -0,0 +1,133 @@ +using Luban.Job.Common.Types; +using Luban.Job.Common.TypeVisitors; +using System; + +namespace Luban.Job.Cfg.TypeVisitors +{ + class CsUnityJsonDeserialize : ITypeFuncVisitor + { + public static CsUnityJsonDeserialize Ins { get; } = new(); + + public string Accept(TBool type, string json, string x) + { + return $"{{ if(!{json}.IsBoolean) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TByte type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TShort type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TFshort type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TInt type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TFint type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TLong type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TFlong type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TFloat type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TDouble type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TEnum type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = ({type.CsUnderingDefineType()}){json}.AsInt; }}"; + } + + public string Accept(TString type, string json, string x) + { + return $"{{ if(!{json}.IsString) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TBytes type, string json, string x) + { + throw new NotSupportedException(); + } + + public string Accept(TText type, string json, string x) + { + return $"{{ if(!{json}.IsString) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + + public string Accept(TBean type, string json, string x) + { + return $"{{ if(!{json}.IsObject) {{ throw new SerializationException(); }} {x} = {type.CsUnderingDefineType()}.Deserialize{type.Bean.Name}({json}); }}"; + } + + public string Accept(TArray type, string json, string x) + { + string tempJsonName = $"_json1"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsArray) {{ throw new SerializationException(); }} int _n = {tempJsonName}.Count; {x} = new {type.ElementType.CsUnderingDefineType()}[_n]; int _index=0; foreach(JSONNode __e in {tempJsonName}.Children) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}[_index++] = __v; }} }}"; + } + + public string Accept(TList type, string json, string x) + { + string tempJsonName = $"_json1"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsArray) {{ throw new SerializationException(); }} {x} = new {type.CsUnderingDefineType()}({tempJsonName}.Count); foreach(JSONNode __e in {tempJsonName}.Children) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; + } + + public string Accept(TSet type, string json, string x) + { + string tempJsonName = $"_json1"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsArray) {{ throw new SerializationException(); }} {x} = new {type.CsUnderingDefineType()}(/*{tempJsonName}.Count*/); foreach(JSONNode __e in {tempJsonName}.Children) {{ {type.ElementType.CsUnderingDefineType()} __v; {type.ElementType.Apply(this, "__e", "__v")} {x}.Add(__v); }} }}"; + } + + public string Accept(TMap type, string json, string x) + { + string tempJsonName = $"_json1"; + return @$"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsArray) {{ throw new SerializationException(); }} {x} = new {type.CsUnderingDefineType()}({tempJsonName}.Count); foreach(JSONNode __e in {tempJsonName}.Children) {{ {type.KeyType.CsUnderingDefineType()} __k; {type.KeyType.Apply(this, "__e[0]", "__k")} {type.ValueType.CsUnderingDefineType()} __v; {type.ValueType.Apply(this, "__e[1]", "__v")} {x}.Add(__k, __v); }} }}"; + } + + public string Accept(TVector2 type, string json, string x) + { + string tempJsonName = $"_json2"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsObject) {{ throw new SerializationException(); }} float __x; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"x\"]", "__x") } float __y; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"y\"]", "__y") } {x} = new System.Numerics.Vector2(__x, __y); }}"; + } + + public string Accept(TVector3 type, string json, string x) + { + string tempJsonName = $"_json2"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsObject) {{ throw new SerializationException(); }} float __x; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"x\"]", "__x") } float __y; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"y\"]", "__y") } float __z; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"z\"]", "__z") } {x} = new System.Numerics.Vector3(__x, __y,__z); }}"; + } + + public string Accept(TVector4 type, string json, string x) + { + string tempJsonName = $"_json2"; + return $"{{ var {tempJsonName} = {json}; if(!{tempJsonName}.IsObject) {{ throw new SerializationException(); }} float __x; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"x\"]", "__x") } float __y; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"y\"]", "__y") } float __z; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"z\"]", "__z") } float __w; {TFloat.Ins.Apply(this, $"{tempJsonName}[\"w\"]", "__w") } {x} = new System.Numerics.Vector4(__x, __y, __z, __w); }}"; + } + + public string Accept(TDateTime type, string json, string x) + { + return $"{{ if(!{json}.IsNumber) {{ throw new SerializationException(); }} {x} = {json}; }}"; + } + } +}