diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs index 243adfa..814fd70 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs @@ -117,165 +117,165 @@ namespace Luban.Job.Cfg.DataVisitors { return; } - //var defFields = record.ImplType.HierarchyFields; - //int i = 0; - //foreach (var fieldValue in record.Fields) - //{ - // var defField = (DefField)defFields[i++]; - // _path.Push(defField.Name); - // switch (defField.CType) - // { - // case TArray a: - // { - // if (defField.ValueValidators.Count > 0) - // { - // var arr = (DArray)fieldValue; - // int index = 0; - // foreach (var value in arr.Datas) - // { - // _path.Push(index++); - // foreach (var v in defField.ValueValidators) - // { - // v.Validate(Ctx, value, defField.IsNullable); - // } - // _path.Pop(); - // } + var defFields = record.ImplType.HierarchyFields; + int i = 0; + foreach (var fieldValue in record.Fields) + { + var defField = (DefField)defFields[i++]; + _path.Push(defField.Name); + switch (defField.CType) + { + case TArray a: + { + if (defField.ValueValidators.Count > 0) + { + var arr = (DArray)fieldValue; + int index = 0; + foreach (var value in arr.Datas) + { + _path.Push(index++); + foreach (var v in defField.ValueValidators) + { + v.Validate(Ctx, value, defField.IsNullable); + } + _path.Pop(); + } - // } - // if (a.ElementType is TBean) - // { - // var arr = (DArray)fieldValue; - // int index = 0; - // foreach (var value in arr.Datas) - // { - // _path.Push(index++); - // Accept((DBean)value, assembly); - // _path.Pop(); - // } + } + if (a.ElementType is TBean) + { + var arr = (DArray)fieldValue; + int index = 0; + foreach (var value in arr.Datas) + { + _path.Push(index++); + Accept((DBean)value, assembly); + _path.Pop(); + } - // } - // break; - // } - // case TList b: - // { - // if (defField.ValueValidators.Count > 0) - // { - // var arr = (DList)fieldValue; - // int index = 0; - // foreach (var value in arr.Datas) - // { - // _path.Push(index++); - // foreach (var v in defField.ValueValidators) - // { - // v.Validate(Ctx, value, false); - // } - // _path.Pop(); - // } + } + break; + } + case TList b: + { + if (defField.ValueValidators.Count > 0) + { + var arr = (DList)fieldValue; + int index = 0; + foreach (var value in arr.Datas) + { + _path.Push(index++); + foreach (var v in defField.ValueValidators) + { + v.Validate(Ctx, value, false); + } + _path.Pop(); + } - // } - // if (b.ElementType is TBean tb) - // { - // var arr = (DList)fieldValue; - // int index = 0; - // foreach (var value in arr.Datas) - // { - // _path.Push(index++); - // Accept((DBean)value, assembly); - // _path.Pop(); - // } + } + if (b.ElementType is TBean tb) + { + var arr = (DList)fieldValue; + int index = 0; + foreach (var value in arr.Datas) + { + _path.Push(index++); + Accept((DBean)value, assembly); + _path.Pop(); + } - // if (defField.IndexField != null) - // { - // var indexSet = new HashSet(); - // if (!tb.GetBeanAs().TryGetField(defField.Index, out var _, out var indexOfIndexField)) - // { - // throw new Exception("impossible"); - // } - // foreach (var value in arr.Datas) - // { - // _path.Push(index++); - // DType indexValue = ((DBean)value).Fields[indexOfIndexField]; - // if (!indexSet.Add(indexValue)) - // { - // throw new Exception($"'{TypeUtil.MakeFullName(_path)}' index:'{indexValue}' 重复"); - // } - // _path.Pop(); - // } - // } - // } - // break; - // } - // case TSet c: - // { - // if (defField.ValueValidators.Count > 0) - // { - // var arr = (DSet)fieldValue; - // foreach (var value in arr.Datas) - // { - // foreach (var v in defField.ValueValidators) - // { - // v.Validate(Ctx, value, false); - // } - // } + if (defField.IndexField != null) + { + var indexSet = new HashSet(); + if (!tb.GetBeanAs().TryGetField(defField.Index, out var _, out var indexOfIndexField)) + { + throw new Exception("impossible"); + } + foreach (var value in arr.Datas) + { + _path.Push(index++); + DType indexValue = ((DBean)value).Fields[indexOfIndexField]; + if (!indexSet.Add(indexValue)) + { + throw new Exception($"'{TypeUtil.MakeFullName(_path)}' index:'{indexValue}' 重复"); + } + _path.Pop(); + } + } + } + break; + } + case TSet c: + { + if (defField.ValueValidators.Count > 0) + { + var arr = (DSet)fieldValue; + foreach (var value in arr.Datas) + { + foreach (var v in defField.ValueValidators) + { + v.Validate(Ctx, value, false); + } + } - // } - // break; - // } + } + break; + } - // case TMap m: - // { - // DMap map = (DMap)fieldValue; - // if (defField.KeyValidators.Count > 0) - // { - // foreach (var key in map.Datas.Keys) - // { - // _path.Push(key); - // foreach (var v in defField.KeyValidators) - // { - // v.Validate(Ctx, key, false); - // } - // _path.Pop(); - // } - // } - // if (defField.ValueValidators.Count > 0) - // { - // foreach (var value in map.Datas.Values) - // { - // _path.Push(value); - // foreach (var v in defField.ValueValidators) - // { - // v.Validate(Ctx, value, false); - // } + case TMap m: + { + DMap map = (DMap)fieldValue; + if (defField.KeyValidators.Count > 0) + { + foreach (var key in map.Datas.Keys) + { + _path.Push(key); + foreach (var v in defField.KeyValidators) + { + v.Validate(Ctx, key, false); + } + _path.Pop(); + } + } + if (defField.ValueValidators.Count > 0) + { + foreach (var value in map.Datas.Values) + { + _path.Push(value); + foreach (var v in defField.ValueValidators) + { + v.Validate(Ctx, value, false); + } - // if (value is DBean dv) - // { - // Accept(dv, assembly); - // } - // _path.Pop(); - // } - // } - // break; - // } - // case TBean n: - // { - // Accept((DBean)fieldValue, assembly); - // break; - // } - // default: - // { - // if (defField.Validators.Count > 0) - // { - // foreach (var v in defField.Validators) - // { - // v.Validate(Ctx, fieldValue, defField.IsNullable); - // } - // } - // break; - // } - // } - // _path.Pop(); - //} + if (value is DBean dv) + { + Accept(dv, assembly); + } + _path.Pop(); + } + } + break; + } + case TBean n: + { + Accept((DBean)fieldValue, assembly); + break; + } + default: + { + if (defField.Validators.Count > 0) + { + foreach (var v in defField.Validators) + { + v.Validate(Ctx, fieldValue, defField.IsNullable); + } + } + break; + } + } + _path.Pop(); + } } public void Accept(DArray type, DefAssembly x) diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index b56d766..4939027 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -28,6 +28,12 @@ namespace Luban.Job.Cfg.Defs public RefValidator ValueRef { get; private set; } + public List Validators { get; } = new List(); + + public List KeyValidators { get; } = new List(); + + public List ValueValidators { get; } = new List(); + // 如果ref了多个表,不再生成 xxx_ref之类的字段,也不会resolve public bool GenRef => Ref != null && Ref.Tables.Count == 1; @@ -289,14 +295,17 @@ namespace Luban.Job.Cfg.Defs if (Ref != null) { + Validators.Add(Ref); ValidateRef(Ref, CType); } if (KeyRef != null) { + KeyValidators.Add(KeyRef); ValidateRef(KeyRef, (CType as TMap).KeyType); } if (ValueRef != null) { + ValueValidators.Add(ValueRef); switch (this.CType) { case TArray ta: