【特性】新增cfg bean的var属性default,用于指定excel默认值

【调整】调整excel格式中bean的field定义, 字段名reference调整为ref,与xml一致
main
walon 2021-08-27 15:39:36 +08:00
parent efd079939f
commit 45279810ec
7 changed files with 107 additions and 61 deletions

View File

@ -38,7 +38,7 @@ namespace Luban.Job.Cfg.DataCreators
}
}
class ExcelDataCreator : ITypeFuncVisitor<object, ExcelStream, DefAssembly, DType>
class ExcelDataCreator : ITypeFuncVisitor<DefField, ExcelStream, DefAssembly, DType>
{
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<DType> ReadList(TType type, object converter, ExcelStream stream, DefAssembly ass)
public List<DType> 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);

View File

@ -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)
{

View File

@ -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<string> _fieldOptionalAttrs = new List<string> {
"index", "sep", "validator", "key_validator", "value_validator",
"ref", "path", "range", "multi_rows", "group", "res", "convert", "comment", "tags" };
private static readonly List<string> _fieldOptionalAttrs = new()
{
"index",
"sep",
"validator",
"key_validator",
"value_validator",
"ref",
"path",
"range",
"multi_rows",
"group",
"res",
"convert",
"comment",
"tags",
"default"
};
private static readonly List<string> _fieldRequireAttrs = new List<string> { "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的默认组不一样。

View File

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

View File

@ -23,6 +23,8 @@ namespace Luban.Job.Cfg.RawDefs
public string Converter { get; set; } = "";
public string DefaultValue { get; set; } = "";
public List<string> Groups { get; set; } = new List<string>();
public List<Validator> KeyValidators { get; } = new List<Validator>();

View File

@ -74,6 +74,8 @@ namespace Luban.Job.Common.Defs
public Dictionary<string, string> 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");
}

View File

@ -12,5 +12,7 @@ namespace Luban.Job.Common.RawDefs
public string Comment { get; set; }
public string Tags { get; set; }
public bool IgnoreNameValidation { get; set; }
}
}