From 45279810ec460c4ef5c631bc8542f2db9ebb410a Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 27 Aug 2021 15:39:36 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9Ecfg=20bean=E7=9A=84var=E5=B1=9E=E6=80=A7default?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=8C=87=E5=AE=9Aexcel=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=80=BC=20=E3=80=90=E8=B0=83=E6=95=B4=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4excel=E6=A0=BC=E5=BC=8F=E4=B8=ADbean=E7=9A=84?= =?UTF-8?q?field=E5=AE=9A=E4=B9=89,=20=E5=AD=97=E6=AE=B5=E5=90=8Dreference?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BAref,=E4=B8=8Exml=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/DataCreators/ExcelDataCreator.cs | 106 +++++++++--------- .../DataCreators/ExcelNamedRowDataCreator.cs | 2 +- src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs | 39 +++++-- src/Luban.Job.Cfg/Source/Defs/DefField.cs | 12 ++ src/Luban.Job.Cfg/Source/RawDefs/CfgField.cs | 2 + .../Source/Defs/DefFieldBase.cs | 5 +- src/Luban.Job.Common/Source/RawDefs/Field.cs | 2 + 7 files changed, 107 insertions(+), 61 deletions(-) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs index 0276aae..2916473 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs @@ -38,7 +38,7 @@ namespace Luban.Job.Cfg.DataCreators } } - class ExcelDataCreator : ITypeFuncVisitor + class ExcelDataCreator : ITypeFuncVisitor { public static ExcelDataCreator Ins { get; } = new ExcelDataCreator(); @@ -76,7 +76,7 @@ namespace Luban.Job.Cfg.DataCreators } } - public DType Accept(TBool type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TBool type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -90,12 +90,12 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DBool.ValueOf(false); + return field?.DefalutDtypeValue ?? DBool.ValueOf(false); } return DBool.ValueOf(CreateBool(d)); } - public DType Accept(TByte type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TByte type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -108,7 +108,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DByte.Default; + return field?.DefalutDtypeValue ?? DByte.Default; } if (!byte.TryParse(d.ToString(), out byte v)) { @@ -117,7 +117,7 @@ namespace Luban.Job.Cfg.DataCreators return new DByte(v); } - public DType Accept(TShort type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TShort type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -130,7 +130,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DShort.Default; + return field?.DefalutDtypeValue ?? DShort.Default; } if (!short.TryParse(d.ToString(), out short v)) { @@ -139,7 +139,7 @@ namespace Luban.Job.Cfg.DataCreators return new DShort(v); } - public DType Accept(TFshort type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TFshort type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -152,7 +152,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DFshort.Default; + return field?.DefalutDtypeValue ?? DFshort.Default; } if (!short.TryParse(d.ToString(), out short v)) { @@ -161,7 +161,7 @@ namespace Luban.Job.Cfg.DataCreators return new DFshort(v); } - public DType Accept(TInt type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TInt type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -174,10 +174,10 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DInt.ValueOf(0); + return field?.DefalutDtypeValue ?? DInt.ValueOf(0); } var ds = d.ToString(); - if (converter is TEnum te) + if (field?.Remapper is TEnum te) { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { @@ -191,7 +191,7 @@ namespace Luban.Job.Cfg.DataCreators return DInt.ValueOf(v); } - public DType Accept(TFint type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TFint type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -204,10 +204,10 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DFint.Default; + return field?.DefalutDtypeValue ?? DFint.Default; } var ds = d.ToString(); - if (converter is TEnum te) + if (field?.Remapper is TEnum te) { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { @@ -221,7 +221,7 @@ namespace Luban.Job.Cfg.DataCreators return new DFint(v); } - public DType Accept(TLong type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TLong type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -234,10 +234,10 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DLong.Default; + return field?.DefalutDtypeValue ?? DLong.Default; } var ds = d.ToString(); - if (converter is TEnum te) + if (field?.Remapper is TEnum te) { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { @@ -251,7 +251,7 @@ namespace Luban.Job.Cfg.DataCreators return DLong.ValueOf(v); } - public DType Accept(TFlong type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TFlong type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -264,10 +264,10 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DFlong.Default; + return field?.DefalutDtypeValue ?? DFlong.Default; } var ds = d.ToString(); - if (converter is TEnum te) + if (field?.Remapper is TEnum te) { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { @@ -281,7 +281,7 @@ namespace Luban.Job.Cfg.DataCreators return new DFlong(v); } - public DType Accept(TFloat type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TFloat type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -294,7 +294,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DFloat.ValueOf(0); + return field?.DefalutDtypeValue ?? DFloat.ValueOf(0); } if (!float.TryParse(d.ToString(), out var v)) { @@ -303,7 +303,7 @@ namespace Luban.Job.Cfg.DataCreators return DFloat.ValueOf(v); } - public DType Accept(TDouble type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TDouble type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -316,7 +316,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DDouble.Default; + return field?.DefalutDtypeValue ?? DDouble.Default; } if (!double.TryParse(d.ToString(), out var v)) { @@ -325,21 +325,21 @@ namespace Luban.Job.Cfg.DataCreators return new DDouble(v); } - public DType Accept(TEnum type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TEnum type, DefField field, ExcelStream x, DefAssembly ass) { var d = x.Read(x.NamedMode); if (CheckNull(type.IsNullable, d)) { return null; } - if (CheckNull(type.IsNullable, d)) + if (CheckIsDefault(type.IsNullable, d) && field?.DefalutDtypeValue != null) { - return null; + return field?.DefalutDtypeValue; } return new DEnum(type, d.ToString().Trim()); } - public DType Accept(TString type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TString type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -360,7 +360,7 @@ namespace Luban.Job.Cfg.DataCreators return DString.ValueOf(s); } - public DType Accept(TBytes type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TBytes type, DefField field, ExcelStream x, DefAssembly ass) { throw new NotImplementedException(); } @@ -381,7 +381,7 @@ namespace Luban.Job.Cfg.DataCreators } } - public DType Accept(TText type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TText type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 2) { @@ -415,11 +415,11 @@ namespace Luban.Job.Cfg.DataCreators string sep = f.ActualSep; if (string.IsNullOrWhiteSpace(sep)) { - list.Add(f.CType.Apply(this, f.Remapper, stream, ass)); + list.Add(f.CType.Apply(this, f, stream, ass)); } else { - list.Add(f.CType.Apply(this, f.Remapper, new ExcelStream(stream.ReadCell(), sep, false), ass)); + list.Add(f.CType.Apply(this, f, new ExcelStream(stream.ReadCell(), sep, false), ass)); } } catch (DataCreateException dce) @@ -437,7 +437,7 @@ namespace Luban.Job.Cfg.DataCreators return list; } - public DType Accept(TBean type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TBean type, DefField field, ExcelStream x, DefAssembly ass) { var originBean = (DefBean)type.Bean; @@ -480,7 +480,7 @@ namespace Luban.Job.Cfg.DataCreators // 容器类统统不支持 type.IsNullable // 因为貌似没意义? - public List ReadList(TType type, object converter, ExcelStream stream, DefAssembly ass) + public List ReadList(TType type, DefField field, ExcelStream stream, DefAssembly ass) { stream.NamedMode = false; string sep = type is TBean bean ? ((DefBean)bean.Bean).Sep : null; @@ -489,32 +489,32 @@ namespace Luban.Job.Cfg.DataCreators { if (string.IsNullOrWhiteSpace(sep)) { - datas.Add(type.Apply(this, converter, stream, ass)); + datas.Add(type.Apply(this, field, stream, ass)); } else { - datas.Add(type.Apply(this, converter, new ExcelStream(stream.ReadCell(), sep, false), ass)); ; + datas.Add(type.Apply(this, field, new ExcelStream(stream.ReadCell(), sep, false), ass)); ; } } return datas; } - public DType Accept(TArray type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TArray type, DefField field, ExcelStream x, DefAssembly ass) { - return new DArray(type, ReadList(type.ElementType, converter, x, ass)); + return new DArray(type, ReadList(type.ElementType, field, x, ass)); } - public DType Accept(TList type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TList type, DefField field, ExcelStream x, DefAssembly ass) { - return new DList(type, ReadList(type.ElementType, converter, x, ass)); + return new DList(type, ReadList(type.ElementType, field, x, ass)); } - public DType Accept(TSet type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TSet type, DefField field, ExcelStream x, DefAssembly ass) { - return new DSet(type, ReadList(type.ElementType, converter, x, ass)); + return new DSet(type, ReadList(type.ElementType, field, x, ass)); } - public DType Accept(TMap type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TMap type, DefField field, ExcelStream x, DefAssembly ass) { x.NamedMode = false; string sep = type.ValueType is TBean bean ? ((DefBean)bean.Bean).Sep : null; @@ -532,7 +532,7 @@ namespace Luban.Job.Cfg.DataCreators return new DMap(type, datas); } - public DType Accept(TVector2 type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TVector2 type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -545,12 +545,12 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DVector2.Default; + return field?.DefalutDtypeValue ?? DVector2.Default; } return DataUtil.CreateVector(type, d.ToString()); } - public DType Accept(TVector3 type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TVector3 type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -563,12 +563,12 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DVector3.Default; + return field?.DefalutDtypeValue ?? DVector3.Default; } return DataUtil.CreateVector(type, d.ToString()); } - public DType Accept(TVector4 type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TVector4 type, DefField field, ExcelStream x, DefAssembly ass) { if (x.NamedMode && x.IncludeNullAndEmptySize != 1) { @@ -581,18 +581,22 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DVector4.Default; + return field?.DefalutDtypeValue ?? DVector4.Default; } return DataUtil.CreateVector(type, d.ToString()); } - public DType Accept(TDateTime type, object converter, ExcelStream x, DefAssembly ass) + public DType Accept(TDateTime type, DefField field, ExcelStream x, DefAssembly ass) { var d = x.Read(); if (CheckNull(type.IsNullable, d)) { return null; } + if (CheckIsDefault(x.NamedMode, d) && field?.DefalutDtypeValue != null) + { + return field?.DefalutDtypeValue; + } if (d is System.DateTime datetime) { return new DDateTime(datetime); diff --git a/src/Luban.Job.Cfg/Source/DataCreators/ExcelNamedRowDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/ExcelNamedRowDataCreator.cs index a7ac77f..72cd09e 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/ExcelNamedRowDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/ExcelNamedRowDataCreator.cs @@ -171,7 +171,7 @@ namespace Luban.Job.Cfg.DataCreators ExcelStream stream = row.GetColumn(f.Name, sep, !f.CType.Apply(IsMultiData.Ins)); try { - list.Add(f.CType.Apply(ExcelDataCreator.Ins, f.Remapper, stream, (DefAssembly)bean.AssemblyBase)); + list.Add(f.CType.Apply(ExcelDataCreator.Ins, f, stream, (DefAssembly)bean.AssemblyBase)); } catch (DataCreateException dce) { diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs index 3dd119c..9169a79 100644 --- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs +++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs @@ -400,6 +400,11 @@ namespace Luban.Job.Cfg.Defs cf.Converter = attrValue; break; } + case "default": + { + cf.DefaultValue = attrValue; + break; + } default: { throw new Exception($"table:'{table.Name}' file:{file.OriginFile} title:'{f.Name}' attr:'{attrs[i]}' is invalid!"); @@ -600,7 +605,7 @@ namespace Luban.Job.Cfg.Defs new CfgField() { Name = "is_multi_rows", Type = "bool" }, new CfgField() { Name = "index", Type = "string" }, new CfgField() { Name = "group", Type = "string" }, - new CfgField() { Name = "reference", Type = "string" }, + new CfgField() { Name = "ref", Type = "string", IgnoreNameValidation = true }, new CfgField() { Name = "path", Type = "string" }, new CfgField() { Name = "comment", Type = "string" }, new CfgField() { Name = "tags", Type = "string" }, @@ -686,13 +691,14 @@ namespace Luban.Job.Cfg.Defs "", "", (b.GetField("comment") as DString).Value.Trim(), - (b.GetField("reference") as DString).Value.Trim(), + (b.GetField("ref") as DString).Value.Trim(), (b.GetField("path") as DString).Value.Trim(), "", "", "", "", - (b.GetField("tags") as DString).Value.Trim() + (b.GetField("tags") as DString).Value.Trim(), + false )).ToList(), }; this._beans.Add(curBean); @@ -706,9 +712,24 @@ namespace Luban.Job.Cfg.Defs await LoadTableRecordDefinesFromFileAsync(dataDir); } - private static readonly List _fieldOptionalAttrs = new List { - "index", "sep", "validator", "key_validator", "value_validator", - "ref", "path", "range", "multi_rows", "group", "res", "convert", "comment", "tags" }; + private static readonly List _fieldOptionalAttrs = new() + { + "index", + "sep", + "validator", + "key_validator", + "value_validator", + "ref", + "path", + "range", + "multi_rows", + "group", + "res", + "convert", + "comment", + "tags", + "default" + }; private static readonly List _fieldRequireAttrs = new List { "name", "type" }; @@ -731,12 +752,13 @@ namespace Luban.Job.Cfg.Defs XmlUtil.GetOptionalAttribute(e, "key_validator"), XmlUtil.GetOptionalAttribute(e, "value_validator"), XmlUtil.GetOptionalAttribute(e, "validator"), - XmlUtil.GetOptionalAttribute(e, "tags") + XmlUtil.GetOptionalAttribute(e, "tags"), + false ); } private Field CreateField(string name, string type, string index, string sep, bool isMultiRow, string group, string resource, string converter, - string comment, string refs, string path, string range, string keyValidator, string valueValidator, string validator, string tags) + string comment, string refs, string path, string range, string keyValidator, string valueValidator, string validator, string tags, bool ignoreNameValidation) { var f = new CfgField() { @@ -749,6 +771,7 @@ namespace Luban.Job.Cfg.Defs Converter = converter, Comment = comment, Tags = tags, + IgnoreNameValidation = ignoreNameValidation, }; // 字段与table的默认组不一样。 diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index dd24ba1..bd3590f 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -1,4 +1,6 @@ using Luban.Common.Utils; +using Luban.Job.Cfg.DataCreators; +using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.RawDefs; using Luban.Job.Cfg.Validators; using Luban.Job.Common.Defs; @@ -148,6 +150,10 @@ namespace Luban.Job.Cfg.Defs public bool HasRecursiveText => HasRecursiveRef; + public string DefaultValue { get; } + + public DType DefalutDtypeValue { get; private set; } + public DefField(DefTypeBase host, CfgField f, int idOffset) : base(host, f, idOffset) { Index = f.Index; @@ -159,6 +165,7 @@ namespace Luban.Job.Cfg.Defs this.ValueValidators.AddRange(f.ValueValidators.Select(v => ValidatorFactory.Create(v))); this.Groups = f.Groups; this.RawDefine = f; + this.DefaultValue = f.DefaultValue; } public override void Compile() @@ -179,6 +186,11 @@ namespace Luban.Job.Cfg.Defs v.Compile(this); } + if (!string.IsNullOrWhiteSpace(this.DefaultValue)) + { + this.DefalutDtypeValue = CType.Apply(StringDataCreator.Ins, this.DefaultValue); + } + switch (CType) { case TArray t: diff --git a/src/Luban.Job.Cfg/Source/RawDefs/CfgField.cs b/src/Luban.Job.Cfg/Source/RawDefs/CfgField.cs index 4237334..12dad12 100644 --- a/src/Luban.Job.Cfg/Source/RawDefs/CfgField.cs +++ b/src/Luban.Job.Cfg/Source/RawDefs/CfgField.cs @@ -23,6 +23,8 @@ namespace Luban.Job.Cfg.RawDefs public string Converter { get; set; } = ""; + public string DefaultValue { get; set; } = ""; + public List Groups { get; set; } = new List(); public List KeyValidators { get; } = new List(); diff --git a/src/Luban.Job.Common/Source/Defs/DefFieldBase.cs b/src/Luban.Job.Common/Source/Defs/DefFieldBase.cs index 6c1dc17..e04b322 100644 --- a/src/Luban.Job.Common/Source/Defs/DefFieldBase.cs +++ b/src/Luban.Job.Common/Source/Defs/DefFieldBase.cs @@ -74,6 +74,8 @@ namespace Luban.Job.Common.Defs public Dictionary Tags { get; } + public bool IgnoreNameValidation { get; set; } + public bool HasTag(string attrName) { return Tags != null && Tags.ContainsKey(attrName); @@ -92,6 +94,7 @@ namespace Luban.Job.Common.Defs Type = f.Type; Comment = f.Comment; Tags = DefUtil.ParseAttrs(f.Tags); + IgnoreNameValidation = f.IgnoreNameValidation; } public virtual void Compile() @@ -101,7 +104,7 @@ namespace Luban.Job.Common.Defs { throw new Exception($"type:'{HostType.FullName}' field:'{Name}' id:{Id} 超出范围"); } - if (!TypeUtil.IsValidName(Name)) + if (!IgnoreNameValidation && !TypeUtil.IsValidName(Name)) { throw new Exception($"type:'{HostType.FullName}' filed name:'{Name}' is reserved"); } diff --git a/src/Luban.Job.Common/Source/RawDefs/Field.cs b/src/Luban.Job.Common/Source/RawDefs/Field.cs index fc233a7..a5843d9 100644 --- a/src/Luban.Job.Common/Source/RawDefs/Field.cs +++ b/src/Luban.Job.Common/Source/RawDefs/Field.cs @@ -12,5 +12,7 @@ namespace Luban.Job.Common.RawDefs public string Comment { get; set; } public string Tags { get; set; } + + public bool IgnoreNameValidation { get; set; } } }