【修复】修复加载定义出错时,打印错误日志无法定位错误的bug

main
walon 2021-09-01 11:28:28 +08:00
parent f0f39381c3
commit 75e73206f4
5 changed files with 67 additions and 76 deletions

View File

@ -67,7 +67,7 @@ namespace Luban.Job.Cfg.Defs
private static readonly List<string> _excelImportRequireAttrs = new List<string> { "name", "type" }; private static readonly List<string> _excelImportRequireAttrs = new List<string> { "name", "type" };
private void AddImportExcel(XElement e) private void AddImportExcel(XElement e)
{ {
ValidAttrKeys(e, null, _excelImportRequireAttrs); ValidAttrKeys(RootXml, e, null, _excelImportRequireAttrs);
var importName = XmlUtil.GetRequiredAttribute(e, "name"); var importName = XmlUtil.GetRequiredAttribute(e, "name");
if (string.IsNullOrWhiteSpace(importName)) if (string.IsNullOrWhiteSpace(importName))
{ {
@ -90,7 +90,7 @@ namespace Luban.Job.Cfg.Defs
private static readonly List<string> _branchRequireAttrs = new List<string> { "name" }; private static readonly List<string> _branchRequireAttrs = new List<string> { "name" };
private void AddBranch(XElement e) private void AddBranch(XElement e)
{ {
ValidAttrKeys(e, null, _branchRequireAttrs); ValidAttrKeys(RootXml, e, null, _branchRequireAttrs);
var branchName = e.Attribute("name").Value; var branchName = e.Attribute("name").Value;
if (string.IsNullOrWhiteSpace(branchName)) if (string.IsNullOrWhiteSpace(branchName))
{ {
@ -108,7 +108,7 @@ namespace Luban.Job.Cfg.Defs
private void AddGroup(XElement e) private void AddGroup(XElement e)
{ {
ValidAttrKeys(e, _groupOptionalAttrs, _groupRequireAttrs); ValidAttrKeys(RootXml, e, _groupOptionalAttrs, _groupRequireAttrs);
List<string> groupNames = CreateGroups(e.Attribute("name").Value); List<string> groupNames = CreateGroups(e.Attribute("name").Value);
foreach (var g in groupNames) foreach (var g in groupNames)
@ -136,7 +136,7 @@ namespace Luban.Job.Cfg.Defs
} }
} }
private void FillValidators(string key, string attr, List<Validator> result) private void FillValidators(string defineFile, string key, string attr, List<Validator> result)
{ {
if (!string.IsNullOrWhiteSpace(attr)) if (!string.IsNullOrWhiteSpace(attr))
{ {
@ -145,7 +145,7 @@ namespace Luban.Job.Cfg.Defs
var sepIndex = validatorStr.IndexOf(':'); var sepIndex = validatorStr.IndexOf(':');
if (sepIndex < 0) if (sepIndex < 0)
{ {
throw new Exception($"定义文件:{CurImportFile} 类型:'{CurDefine}' key:'{key}' attr:'{attr}' 不是合法的 validator 定义 (key1:value1#key2:value2 ...)"); throw new Exception($"定义文件:{defineFile} key:'{key}' attr:'{attr}' 不是合法的 validator 定义 (key1:value1#key2:value2 ...)");
} }
result.Add(new Validator() { Type = validatorStr[..sepIndex], Rule = validatorStr[(sepIndex + 1)..] }); result.Add(new Validator() { Type = validatorStr[..sepIndex], Rule = validatorStr[(sepIndex + 1)..] });
} }
@ -162,7 +162,7 @@ namespace Luban.Job.Cfg.Defs
var refs = new List<string>(); var refs = new List<string>();
s_logger.Trace("service name:{name} manager:{manager}", name, manager); s_logger.Trace("service name:{name} manager:{manager}", name, manager);
ValidAttrKeys(e, _serviceAttrs, _serviceAttrs); ValidAttrKeys(RootXml, e, _serviceAttrs, _serviceAttrs);
foreach (XElement ele in e.Elements()) foreach (XElement ele in e.Elements())
{ {
string tagName = ele.Name.LocalName; string tagName = ele.Name.LocalName;
@ -209,7 +209,7 @@ namespace Luban.Job.Cfg.Defs
return true; return true;
} }
private ETableMode ConvertMode(string tableName, string modeStr, string indexStr) private ETableMode ConvertMode(string defineFile, string tableName, string modeStr, string indexStr)
{ {
ETableMode mode; ETableMode mode;
switch (modeStr) switch (modeStr)
@ -218,7 +218,7 @@ namespace Luban.Job.Cfg.Defs
{ {
if (!string.IsNullOrWhiteSpace(indexStr)) if (!string.IsNullOrWhiteSpace(indexStr))
{ {
throw new Exception($"定义文件:{CurImportFile} table:'{tableName}' mode=one 是单例表不支持定义index属性"); throw new Exception($"定义文件:{defineFile} table:'{tableName}' mode=one 是单例表不支持定义index属性");
} }
mode = ETableMode.ONE; mode = ETableMode.ONE;
break; break;
@ -248,9 +248,9 @@ namespace Luban.Job.Cfg.Defs
private readonly List<string> _tableOptionalAttrs = new List<string> { "index", "mode", "group", "branch_input", "comment", "define_from_file" }; private readonly List<string> _tableOptionalAttrs = new List<string> { "index", "mode", "group", "branch_input", "comment", "define_from_file" };
private readonly List<string> _tableRequireAttrs = new List<string> { "name", "value", "input" }; private readonly List<string> _tableRequireAttrs = new List<string> { "name", "value", "input" };
private void AddTable(XElement e) private void AddTable(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _tableOptionalAttrs, _tableRequireAttrs); ValidAttrKeys(defineFile, e, _tableOptionalAttrs, _tableRequireAttrs);
string name = XmlUtil.GetRequiredAttribute(e, "name"); string name = XmlUtil.GetRequiredAttribute(e, "name");
string module = CurNamespace; string module = CurNamespace;
string valueType = XmlUtil.GetRequiredAttribute(e, "value"); string valueType = XmlUtil.GetRequiredAttribute(e, "value");
@ -262,7 +262,7 @@ namespace Luban.Job.Cfg.Defs
string branchInput = XmlUtil.GetOptionalAttribute(e, "branch_input"); string branchInput = XmlUtil.GetOptionalAttribute(e, "branch_input");
string mode = XmlUtil.GetOptionalAttribute(e, "mode"); string mode = XmlUtil.GetOptionalAttribute(e, "mode");
string tags = XmlUtil.GetOptionalAttribute(e, "tags"); string tags = XmlUtil.GetOptionalAttribute(e, "tags");
AddTable(CurImportFile, name, module, valueType, index, mode, group, comment, defineFromFile, input, branchInput, tags); AddTable(defineFile, name, module, valueType, index, mode, group, comment, defineFromFile, input, branchInput, tags);
} }
private void AddTable(string defineFile, string name, string module, string valueType, string index, string mode, string group, private void AddTable(string defineFile, string name, string module, string valueType, string index, string mode, string group,
@ -277,7 +277,7 @@ namespace Luban.Job.Cfg.Defs
Index = index, Index = index,
Groups = CreateGroups(group), Groups = CreateGroups(group),
Comment = comment, Comment = comment,
Mode = ConvertMode(name, mode, index), Mode = ConvertMode(defineFile, name, mode, index),
Tags = tags, Tags = tags,
}; };
@ -689,6 +689,7 @@ namespace Luban.Job.Cfg.Defs
Tags = tags, Tags = tags,
Parent = "", Parent = "",
Fields = fields.Datas.Select(d => (DBean)d).Select(b => this.CreateField( Fields = fields.Datas.Select(d => (DBean)d).Select(b => this.CreateField(
file.ActualFile,
(b.GetField("name") as DString).Value.Trim(), (b.GetField("name") as DString).Value.Trim(),
(b.GetField("type") as DString).Value.Trim(), (b.GetField("type") as DString).Value.Trim(),
(b.GetField("index") as DString).Value.Trim(), (b.GetField("index") as DString).Value.Trim(),
@ -742,11 +743,11 @@ namespace Luban.Job.Cfg.Defs
private static readonly List<string> _fieldRequireAttrs = new List<string> { "name", "type" }; private static readonly List<string> _fieldRequireAttrs = new List<string> { "name", "type" };
protected override Field CreateField(XElement e) protected override Field CreateField(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _fieldOptionalAttrs, _fieldRequireAttrs); ValidAttrKeys(defineFile, e, _fieldOptionalAttrs, _fieldRequireAttrs);
return CreateField(XmlUtil.GetRequiredAttribute(e, "name"), return CreateField(defineFile, XmlUtil.GetRequiredAttribute(e, "name"),
XmlUtil.GetRequiredAttribute(e, "type"), XmlUtil.GetRequiredAttribute(e, "type"),
XmlUtil.GetOptionalAttribute(e, "index"), XmlUtil.GetOptionalAttribute(e, "index"),
XmlUtil.GetOptionalAttribute(e, "sep"), XmlUtil.GetOptionalAttribute(e, "sep"),
@ -767,7 +768,7 @@ namespace Luban.Job.Cfg.Defs
); );
} }
private Field CreateField(string name, string type, string index, string sep, bool isMultiRow, string group, string resource, string converter, private Field CreateField(string defileFile, 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, bool isRowOrient) bool ignoreNameValidation, bool isRowOrient)
{ {
@ -795,7 +796,7 @@ namespace Luban.Job.Cfg.Defs
} }
else if (!ValidGroup(f.Groups, out var invalidGroup)) else if (!ValidGroup(f.Groups, out var invalidGroup))
{ {
throw new Exception($"定义文件:{CurImportFile} field:'{name}' group:'{invalidGroup}' 不存在"); throw new Exception($"定义文件:{defileFile} field:'{name}' group:'{invalidGroup}' 不存在");
} }
f.Type = type; f.Type = type;
@ -804,18 +805,18 @@ namespace Luban.Job.Cfg.Defs
FillValueValidator(f, path, "path"); // (ue4|unity|normal|regex);xxx;xxx FillValueValidator(f, path, "path"); // (ue4|unity|normal|regex);xxx;xxx
FillValueValidator(f, range, "range"); FillValueValidator(f, range, "range");
FillValidators("key_validator", keyValidator, f.KeyValidators); FillValidators(defileFile, "key_validator", keyValidator, f.KeyValidators);
FillValidators("value_validator", valueValidator, f.ValueValidators); FillValidators(defileFile, "value_validator", valueValidator, f.ValueValidators);
FillValidators("validator", validator, f.Validators); FillValidators(defileFile, "validator", validator, f.Validators);
return f; return f;
} }
private static readonly List<string> _beanOptinsAttrs = new List<string> { "value_type", "alias", "sep", "comment", "tags" }; private static readonly List<string> _beanOptinsAttrs = new List<string> { "value_type", "alias", "sep", "comment", "tags" };
private static readonly List<string> _beanRequireAttrs = new List<string> { "name" }; private static readonly List<string> _beanRequireAttrs = new List<string> { "name" };
protected override void AddBean(XElement e, string parent) protected override void AddBean(string defineFile, XElement e, string parent)
{ {
ValidAttrKeys(e, _beanOptinsAttrs, _beanRequireAttrs); ValidAttrKeys(defineFile, e, _beanOptinsAttrs, _beanRequireAttrs);
var b = new CfgBean() var b = new CfgBean()
{ {
@ -841,9 +842,9 @@ namespace Luban.Job.Cfg.Defs
{ {
if (defineAnyChildBean) if (defineAnyChildBean)
{ {
throw new LoadDefException($"定义文件:{CurImportFile} 类型:{b.FullName} 的多态子bean必须在所有成员字段 <var> 之前定义"); throw new LoadDefException($"定义文件:{defineFile} 类型:{b.FullName} 的多态子bean必须在所有成员字段 <var> 之前定义");
} }
b.Fields.Add(CreateField(fe)); ; b.Fields.Add(CreateField(defineFile, fe)); ;
break; break;
} }
case "bean": case "bean":
@ -854,7 +855,7 @@ namespace Luban.Job.Cfg.Defs
} }
default: default:
{ {
throw new LoadDefException($"定义文件:{CurImportFile} 类型:{b.FullName} 不支持 tag:{fe.Name}"); throw new LoadDefException($"定义文件:{defineFile} 类型:{b.FullName} 不支持 tag:{fe.Name}");
} }
} }
} }
@ -864,7 +865,7 @@ namespace Luban.Job.Cfg.Defs
var fullname = b.FullName; var fullname = b.FullName;
foreach (var cb in childBeans) foreach (var cb in childBeans)
{ {
AddBean(cb, fullname); AddBean(defineFile, cb, fullname);
} }
} }
} }

View File

@ -11,6 +11,7 @@ namespace Luban.Job.Cfg.Utils
{ {
class DTypeTemplateExtends : TTypeTemplateExtends class DTypeTemplateExtends : TTypeTemplateExtends
{ {
public static bool IsSimpleLiteralData(DType type) public static bool IsSimpleLiteralData(DType type)
{ {
return type.Apply(IsSimpleLiteralDataVisitor.Ins); return type.Apply(IsSimpleLiteralDataVisitor.Ins);

View File

@ -41,11 +41,9 @@ namespace Luban.Job.Common.Defs
public bool IsBeanFieldMustDefineId { get; protected set; } public bool IsBeanFieldMustDefineId { get; protected set; }
private readonly Dictionary<string, Action<XElement>> _rootDefineHandlers = new Dictionary<string, Action<XElement>>(); private readonly Dictionary<string, Action<XElement>> _rootDefineHandlers = new Dictionary<string, Action<XElement>>();
private readonly Dictionary<string, Action<XElement>> _moduleDefineHandlers = new Dictionary<string, Action<XElement>>(); private readonly Dictionary<string, Action<string, XElement>> _moduleDefineHandlers = new();
protected readonly Stack<string> _namespaceStack = new Stack<string>(); protected readonly Stack<string> _namespaceStack = new Stack<string>();
protected readonly Stack<string> _importFileStack = new Stack<string>();
protected readonly Stack<XElement> _defineStack = new Stack<XElement>();
protected string TopModule { get; private set; } protected string TopModule { get; private set; }
@ -65,6 +63,7 @@ namespace Luban.Job.Common.Defs
_moduleDefineHandlers.Add("bean", AddBean); _moduleDefineHandlers.Add("bean", AddBean);
} }
public string RootXml => _rootXml;
private string _rootXml; private string _rootXml;
public async Task LoadAsync(string rootXml) public async Task LoadAsync(string rootXml)
@ -99,16 +98,12 @@ namespace Luban.Job.Common.Defs
_rootDefineHandlers.Add(name, handler); _rootDefineHandlers.Add(name, handler);
} }
protected void RegisterModuleDefineHandler(string name, Action<XElement> handler) protected void RegisterModuleDefineHandler(string name, Action<string, XElement> handler)
{ {
_moduleDefineHandlers.Add(name, handler); _moduleDefineHandlers.Add(name, handler);
} }
protected string CurNamespace => _namespaceStack.Peek(); protected string CurNamespace => _namespaceStack.Count > 0 ? _namespaceStack.Peek() : "";
protected string CurImportFile => _importFileStack.Peek();
protected XElement CurDefine => _defineStack.Peek();
#region root handler #region root handler
@ -129,9 +124,7 @@ namespace Luban.Job.Common.Defs
if (fileOrDirContent.IsFile) if (fileOrDirContent.IsFile)
{ {
s_logger.Trace("== file:{file}", xmlFullPath); s_logger.Trace("== file:{file}", xmlFullPath);
_importFileStack.Push(xmlFullPath); AddModule(xmlFullPath, XmlUtil.Open(xmlFullPath, await Agent.GetFromCacheOrReadAllBytesAsync(xmlFullPath, fileOrDirContent.Md5)));
AddModule(XmlUtil.Open(xmlFullPath, await Agent.GetFromCacheOrReadAllBytesAsync(xmlFullPath, fileOrDirContent.Md5)));
_importFileStack.Pop();
} }
else else
{ {
@ -147,9 +140,7 @@ namespace Luban.Job.Common.Defs
continue; continue;
} }
string subFullPath = subFileName; string subFullPath = subFileName;
_importFileStack.Push(subFullPath); AddModule(subFullPath, XmlUtil.Open(subFullPath, await Agent.GetFromCacheOrReadAllBytesAsync(subFullPath, subFile.MD5)));
AddModule(XmlUtil.Open(subFullPath, await Agent.GetFromCacheOrReadAllBytesAsync(subFullPath, subFile.MD5)));
_importFileStack.Pop();
} }
} }
} }
@ -159,7 +150,7 @@ namespace Luban.Job.Common.Defs
#region module handler #region module handler
private void AddModule(XElement me) private void AddModule(string defineFile, XElement me)
{ {
var name = XmlUtil.GetOptionalAttribute(me, "name"); var name = XmlUtil.GetOptionalAttribute(me, "name");
//if (string.IsNullOrEmpty(name)) //if (string.IsNullOrEmpty(name))
@ -177,18 +168,16 @@ namespace Luban.Job.Common.Defs
{ {
if (tagName != "module") if (tagName != "module")
{ {
_defineStack.Push(e); handler(defineFile, e);
handler(e);
_defineStack.Pop();
} }
else else
{ {
handler(e); handler(defineFile, e);
} }
} }
else else
{ {
throw new LoadDefException($"定义文件:{CurImportFile} module:{CurNamespace} 不支持 tag:{tagName}"); throw new LoadDefException($"定义文件:{defineFile} module:{CurNamespace} 不支持 tag:{tagName}");
} }
} }
_namespaceStack.Pop(); _namespaceStack.Pop();
@ -197,9 +186,9 @@ namespace Luban.Job.Common.Defs
private static readonly List<string> _fieldRequireAttrs = new List<string> { "name", "type", }; private static readonly List<string> _fieldRequireAttrs = new List<string> { "name", "type", };
private static readonly List<string> _fieldOptionalAttrs = new List<string> { "id", "comment", "tags" }; private static readonly List<string> _fieldOptionalAttrs = new List<string> { "id", "comment", "tags" };
protected virtual Field CreateField(XElement e) protected virtual Field CreateField(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _fieldOptionalAttrs, _fieldRequireAttrs); ValidAttrKeys(defineFile, e, _fieldOptionalAttrs, _fieldRequireAttrs);
var f = new Field() var f = new Field()
{ {
Id = XmlUtil.GetOptionIntAttribute(e, "id"), Id = XmlUtil.GetOptionIntAttribute(e, "id"),
@ -211,9 +200,9 @@ namespace Luban.Job.Common.Defs
return f; return f;
} }
protected void AddBean(XElement e) protected void AddBean(string defineFile, XElement e)
{ {
AddBean(e, ""); AddBean(defineFile, e, "");
} }
private static readonly List<string> _beanOptinsAttrs1 = new List<string> { "compatible", "value_type", "comment", "tags" }; private static readonly List<string> _beanOptinsAttrs1 = new List<string> { "compatible", "value_type", "comment", "tags" };
@ -222,15 +211,15 @@ namespace Luban.Job.Common.Defs
private static readonly List<string> _beanOptinsAttrs2 = new List<string> { "id", "compatible", "value_type", "comment", "tags" }; private static readonly List<string> _beanOptinsAttrs2 = new List<string> { "id", "compatible", "value_type", "comment", "tags" };
private static readonly List<string> _beanRequireAttrs2 = new List<string> { "name" }; private static readonly List<string> _beanRequireAttrs2 = new List<string> { "name" };
protected virtual void AddBean(XElement e, string parent) protected virtual void AddBean(string defineFile, XElement e, string parent)
{ {
if (IsBeanFieldMustDefineId) if (IsBeanFieldMustDefineId)
{ {
ValidAttrKeys(e, _beanOptinsAttrs1, _beanRequireAttrs1); ValidAttrKeys(defineFile, e, _beanOptinsAttrs1, _beanRequireAttrs1);
} }
else else
{ {
ValidAttrKeys(e, _beanOptinsAttrs2, _beanRequireAttrs2); ValidAttrKeys(defineFile, e, _beanOptinsAttrs2, _beanRequireAttrs2);
} }
var b = new Bean() var b = new Bean()
{ {
@ -254,9 +243,9 @@ namespace Luban.Job.Common.Defs
{ {
if (defineAnyChildBean) if (defineAnyChildBean)
{ {
throw new LoadDefException($"定义文件:{CurImportFile} 类型:{b.FullName} 的多态子bean必须在所有成员字段 <var> 之前定义"); throw new LoadDefException($"定义文件:{defineFile} 类型:{b.FullName} 的多态子bean必须在所有成员字段 <var> 之前定义");
} }
b.Fields.Add(CreateField(fe)); ; b.Fields.Add(CreateField(defineFile, fe)); ;
break; break;
} }
case "bean": case "bean":
@ -267,7 +256,7 @@ namespace Luban.Job.Common.Defs
} }
default: default:
{ {
throw new LoadDefException($"定义文件:{CurImportFile} 类型:{b.FullName} 不支持 tag:{fe.Name}"); throw new LoadDefException($"定义文件:{defineFile} 类型:{b.FullName} 不支持 tag:{fe.Name}");
} }
} }
} }
@ -277,7 +266,7 @@ namespace Luban.Job.Common.Defs
var fullname = b.FullName; var fullname = b.FullName;
foreach (var cb in childBeans) foreach (var cb in childBeans)
{ {
AddBean(cb, fullname); AddBean(defineFile, cb, fullname);
} }
} }
@ -286,21 +275,21 @@ namespace Luban.Job.Common.Defs
return XmlUtil.GetRequiredAttribute(e, key); return XmlUtil.GetRequiredAttribute(e, key);
} }
protected void ValidAttrKeys(XElement e, List<string> optionKeys, List<string> requireKeys) protected void ValidAttrKeys(string defineFile, XElement e, List<string> optionKeys, List<string> requireKeys)
{ {
foreach (var k in e.Attributes()) foreach (var k in e.Attributes())
{ {
var name = k.Name.LocalName; var name = k.Name.LocalName;
if (!requireKeys.Contains(name) && (optionKeys != null && !optionKeys.Contains(name))) if (!requireKeys.Contains(name) && (optionKeys != null && !optionKeys.Contains(name)))
{ {
throw new LoadDefException($"定义文件:{CurImportFile} module:{CurNamespace} 定义:{e} 包含未知属性 attr:{name}"); throw new LoadDefException($"定义文件:{defineFile} module:{CurNamespace} 定义:{e} 包含未知属性 attr:{name}");
} }
} }
foreach (var k in requireKeys) foreach (var k in requireKeys)
{ {
if (e.Attribute(k) == null) if (e.Attribute(k) == null)
{ {
throw new LoadDefException($"定义文件:{CurImportFile} module:{CurNamespace} 定义:{e} 缺失属性 attr:{k}"); throw new LoadDefException($"定义文件:{defineFile} module:{CurNamespace} 定义:{e} 缺失属性 attr:{k}");
} }
} }
} }
@ -312,9 +301,9 @@ namespace Luban.Job.Common.Defs
private static readonly List<string> _constItemRequiredAttrs = new List<string> { "name", "type" }; private static readonly List<string> _constItemRequiredAttrs = new List<string> { "name", "type" };
private static readonly List<string> _constItemOptionalAttrs = new List<string> { "value", "comment" }; private static readonly List<string> _constItemOptionalAttrs = new List<string> { "value", "comment" };
protected void AddConst(XElement e) protected void AddConst(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _constOptionalAttrs, _constRequiredAttrs); ValidAttrKeys(defineFile, e, _constOptionalAttrs, _constRequiredAttrs);
var c = new Const() var c = new Const()
{ {
Name = XmlUtil.GetRequiredAttribute(e, "name"), Name = XmlUtil.GetRequiredAttribute(e, "name"),
@ -323,7 +312,7 @@ namespace Luban.Job.Common.Defs
}; };
foreach (XElement item in e.Elements()) foreach (XElement item in e.Elements())
{ {
ValidAttrKeys(item, _constItemOptionalAttrs, _constItemRequiredAttrs); ValidAttrKeys(defineFile, item, _constItemOptionalAttrs, _constItemRequiredAttrs);
c.Items.Add(new ConstItem() c.Items.Add(new ConstItem()
{ {
Name = XmlUtil.GetRequiredAttribute(item, "name"), Name = XmlUtil.GetRequiredAttribute(item, "name"),
@ -343,9 +332,9 @@ namespace Luban.Job.Common.Defs
private static readonly List<string> _enumItemOptionalAttrs = new List<string> { "value", "alias", "comment", "tags" }; private static readonly List<string> _enumItemOptionalAttrs = new List<string> { "value", "alias", "comment", "tags" };
private static readonly List<string> _enumItemRequiredAttrs = new List<string> { "name" }; private static readonly List<string> _enumItemRequiredAttrs = new List<string> { "name" };
protected void AddEnum(XElement e) protected void AddEnum(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _enumOptionalAttrs, _enumRequiredAttrs); ValidAttrKeys(defineFile, e, _enumOptionalAttrs, _enumRequiredAttrs);
var en = new PEnum() var en = new PEnum()
{ {
Name = XmlUtil.GetRequiredAttribute(e, "name"), Name = XmlUtil.GetRequiredAttribute(e, "name"),
@ -357,7 +346,7 @@ namespace Luban.Job.Common.Defs
foreach (XElement item in e.Elements()) foreach (XElement item in e.Elements())
{ {
ValidAttrKeys(item, _enumItemOptionalAttrs, _enumItemRequiredAttrs); ValidAttrKeys(defineFile, item, _enumItemOptionalAttrs, _enumItemRequiredAttrs);
en.Items.Add(new EnumItem() en.Items.Add(new EnumItem()
{ {
Name = XmlUtil.GetRequiredAttribute(item, "name"), Name = XmlUtil.GetRequiredAttribute(item, "name"),

View File

@ -36,9 +36,9 @@ namespace Luban.Job.Db.Defs
private readonly List<string> _tableOptionalAttrs = new List<string> { "memory", "comment" }; private readonly List<string> _tableOptionalAttrs = new List<string> { "memory", "comment" };
private readonly List<string> _tableRequireAttrs = new List<string> { "name", "id", "key", "value" }; private readonly List<string> _tableRequireAttrs = new List<string> { "name", "id", "key", "value" };
private void AddTable(XElement e) private void AddTable(string defineFile, XElement e)
{ {
ValidAttrKeys(e, _tableOptionalAttrs, _tableRequireAttrs); ValidAttrKeys(defineFile, e, _tableOptionalAttrs, _tableRequireAttrs);
var p = new Table() var p = new Table()
{ {
Id = XmlUtil.GetRequiredIntAttribute(e, "id"), Id = XmlUtil.GetRequiredIntAttribute(e, "id"),

View File

@ -38,9 +38,9 @@ namespace Luban.Job.Proto.Defs
private readonly List<string> rpcAttrs = new List<string> { "id" }; private readonly List<string> rpcAttrs = new List<string> { "id" };
private readonly List<string> rpcRequiredAttrs = new List<string> { "name", "arg", "res" }; private readonly List<string> rpcRequiredAttrs = new List<string> { "name", "arg", "res" };
private void AddRpc(XElement e) private void AddRpc(string defineFile, XElement e)
{ {
ValidAttrKeys(e, rpcAttrs, rpcRequiredAttrs); ValidAttrKeys(defineFile, e, rpcAttrs, rpcRequiredAttrs);
var r = new PRpc() var r = new PRpc()
{ {
Name = XmlUtil.GetRequiredAttribute(e, "name"), Name = XmlUtil.GetRequiredAttribute(e, "name"),
@ -57,9 +57,9 @@ namespace Luban.Job.Proto.Defs
private readonly List<string> protoOptionalAttrs = new List<string> { "id", "comment" }; private readonly List<string> protoOptionalAttrs = new List<string> { "id", "comment" };
private readonly List<string> protoRequiredAttrs = new List<string> { "name" }; private readonly List<string> protoRequiredAttrs = new List<string> { "name" };
private void AddProto(XElement e) private void AddProto(string defineFile, XElement e)
{ {
ValidAttrKeys(e, protoOptionalAttrs, protoRequiredAttrs); ValidAttrKeys(defineFile, e, protoOptionalAttrs, protoRequiredAttrs);
var p = new PProto() var p = new PProto()
{ {
@ -75,12 +75,12 @@ namespace Luban.Job.Proto.Defs
{ {
case "var": case "var":
{ {
p.Fields.Add(CreateField(fe)); ; p.Fields.Add(CreateField(defineFile, fe)); ;
break; break;
} }
default: default:
{ {
throw new Exception($"定义文件:{CurImportFile} 不支持 tag:{fe.Name}"); throw new Exception($"定义文件:{defineFile} 不支持 tag:{fe.Name}");
} }
} }
@ -95,7 +95,7 @@ namespace Luban.Job.Proto.Defs
{ {
var name = XmlUtil.GetRequiredAttribute(e, "name"); var name = XmlUtil.GetRequiredAttribute(e, "name");
s_logger.Trace("service {service}", name); s_logger.Trace("service {service}", name);
ValidAttrKeys(e, serviceAttrs, serviceAttrs); ValidAttrKeys(RootXml, e, serviceAttrs, serviceAttrs);
foreach (XElement ele in e.Elements()) foreach (XElement ele in e.Elements())
{ {
s_logger.Trace("service {service_name} node: {name} {value}", name, ele.Name, ele.Attribute("value")?.Value); s_logger.Trace("service {service_name} node: {name} {value}", name, ele.Name, ele.Attribute("value")?.Value);