From 699b5a167a4317b38413fe2b0b9a91b959d10911 Mon Sep 17 00:00:00 2001 From: walon Date: Tue, 19 Jul 2022 12:58:02 +0800 Subject: [PATCH] =?UTF-8?q?[new]=20range=E5=92=8Csize=E9=83=BD=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9B=BA=E5=AE=9A=E5=A4=A7=E5=B0=8F=E6=88=96=E8=80=85?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E6=AE=B5=20=20xxx=3Dvalue=20=E6=88=96=20xxx?= =?UTF-8?q?=3D[a,b]=20=E7=9A=84=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Luban.Job.Cfg/Source/Validators/Range.cs | 145 ++++++++++++++++++ .../Source/Validators/RangeValidator.cs | 137 ++--------------- .../Source/Validators/SizeValidator.cs | 16 +- src/Luban.Job.Common/Source/Utils/DefUtil.cs | 4 +- 4 files changed, 168 insertions(+), 134 deletions(-) create mode 100644 src/Luban.Job.Cfg/Source/Validators/Range.cs diff --git a/src/Luban.Job.Cfg/Source/Validators/Range.cs b/src/Luban.Job.Cfg/Source/Validators/Range.cs new file mode 100644 index 0000000..278da3f --- /dev/null +++ b/src/Luban.Job.Cfg/Source/Validators/Range.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Luban.Job.Cfg.Validators +{ + internal class Range + { + private readonly string _str; + + private long? _min; + private long? _max; + + private double? _mind; + private double? _maxd; + + private bool _includeMinBound; + + private bool _includeMaxBound; + + public Range(string strRange) + { + _str = strRange.Trim(); + } + + public string RawStr => _str; + + private bool TryParse(string s, ref long? x) + { + s = s.Trim(); + if (string.IsNullOrEmpty(s)) + { + x = null; + return true; + } + else if (long.TryParse(s, out var v)) + { + x = v; + return true; + } + else + { + return false; + } + } + + private bool TryParse(string s, ref double? x) + { + s = s.Trim(); + if (string.IsNullOrEmpty(s)) + { + x = null; + return true; + } + else if (double.TryParse(s, out var v)) + { + x = v; + return true; + } + else + { + return false; + } + } + + public void Compile() + { + void ThrowError() + { + throw new Exception($"range定义不合法"); + } + + if (long.TryParse(_str, out long value)) + { + // size=xxxx + _min = _max = value; + _mind = _maxd = value; + _includeMinBound = _includeMaxBound = true; + return; + } + + if (_str.Length <= 2) + { + ThrowError(); + } + switch (_str[0]) + { + case '[': _includeMinBound = true; break; + case '(': _includeMinBound = false; break; + default: ThrowError(); break; + } + switch (_str[^1]) + { + case ']': _includeMaxBound = true; break; + case ')': _includeMaxBound = false; break; + default: ThrowError(); break; + } + + var pars = _str[1..^1].Split(','); + if (pars.Length != 2) + { + ThrowError(); + } + + bool p1 = TryParse(pars[0], ref _min); + bool p2 = TryParse(pars[0], ref _mind); + bool p3 = TryParse(pars[1], ref _max); + bool p4 = TryParse(pars[1], ref _maxd); + + if ((!p1 && !p2) || (!p3 && !p4)) + { + ThrowError(); + } + } + + + public bool CheckInLongRange(long x) + { + if (_min is long m && (_includeMinBound ? m > x : m >= x)) + { + return false; + } + if (_max is long n && (_includeMaxBound ? n < x : n <= x)) + { + return false; + } + return true; + } + + public bool CheckInDoubleRange(double x) + { + if (_mind is double m && (_includeMinBound ? m > x : m >= x)) + { + return false; + } + if (_maxd is double n && (_includeMaxBound ? n < x : n <= x)) + { + return false; + } + return true; + } + } +} diff --git a/src/Luban.Job.Cfg/Source/Validators/RangeValidator.cs b/src/Luban.Job.Cfg/Source/Validators/RangeValidator.cs index 6b93295..84e840d 100644 --- a/src/Luban.Job.Cfg/Source/Validators/RangeValidator.cs +++ b/src/Luban.Job.Cfg/Source/Validators/RangeValidator.cs @@ -11,128 +11,17 @@ namespace Luban.Job.Cfg.Validators { public TType Type { get; } - private readonly string _str; - - private long? _min; - private long? _max; - - private double? _mind; - private double? _maxd; - - private bool _includeMinBound; - - private bool _includeMaxBound; + private Range _range; public RangeValidator(TType type, string strRange) { Type = type; - _str = strRange.Trim(); - } - - private bool TryParse(string s, ref long? x) - { - s = s.Trim(); - if (string.IsNullOrEmpty(s)) - { - x = null; - return true; - } - else if (long.TryParse(s, out var v)) - { - x = v; - return true; - } - else - { - return false; - } - } - - private bool TryParse(string s, ref double? x) - { - s = s.Trim(); - if (string.IsNullOrEmpty(s)) - { - x = null; - return true; - } - else if (double.TryParse(s, out var v)) - { - x = v; - return true; - } - else - { - return false; - } + _range = new Range(strRange); } public void Compile(DefFieldBase def) { - void ThrowError() - { - throw new Exception($"结构:{ def.HostType.FullName } 字段: { def.Name} range 定义:{_str} 不合法"); - } - - if (_str.Length <= 2) - { - ThrowError(); - } - switch (_str[0]) - { - case '[': _includeMinBound = true; break; - case '(': _includeMinBound = false; break; - default: ThrowError(); break; - } - switch (_str[^1]) - { - case ']': _includeMaxBound = true; break; - case ')': _includeMaxBound = false; break; - default: ThrowError(); break; - } - - var pars = _str[1..^1].Split(','); - if (pars.Length != 2) - { - ThrowError(); - } - - bool p1 = TryParse(pars[0], ref _min); - bool p2 = TryParse(pars[0], ref _mind); - bool p3 = TryParse(pars[1], ref _max); - bool p4 = TryParse(pars[1], ref _maxd); - - if ((!p1 && !p2) || (!p3 && !p4)) - { - ThrowError(); - } - } - - - private bool CheckInLongRange(long x) - { - if (_min is long m && (_includeMinBound ? m > x : m >= x)) - { - return false; - } - if (_max is long n && (_includeMaxBound ? n < x : n <= x)) - { - return false; - } - return true; - } - - private bool CheckInDoubleRange(double x) - { - if (_mind is double m && (_includeMinBound ? m > x : m >= x)) - { - return false; - } - if (_maxd is double n && (_includeMaxBound ? n < x : n <= x)) - { - return false; - } - return true; + _range.Compile(); } public string Source => ValidatorContext.CurrentVisitor.CurrentValidateRecord.Source; @@ -142,7 +31,7 @@ namespace Luban.Job.Cfg.Validators var assembly = ctx.Assembly; void LogError() { - assembly.Agent.Error("记录 {0}:{1} (来自文件:{2}) 不在范围:{3}内", ValidatorContext.CurrentRecordPath, data, Source, _str); + assembly.Agent.Error("记录 {0}:{1} (来自文件:{2}) 不在范围:{3}内", ValidatorContext.CurrentRecordPath, data, Source, _range.RawStr); } if (type.IsNullable && data == null) @@ -154,7 +43,7 @@ namespace Luban.Job.Cfg.Validators { case DByte b: { - if (!CheckInLongRange(b.Value)) + if (!_range.CheckInLongRange(b.Value)) { LogError(); return; @@ -163,7 +52,7 @@ namespace Luban.Job.Cfg.Validators } case DFshort s: { - if (!CheckInLongRange(s.Value)) + if (!_range.CheckInLongRange(s.Value)) { LogError(); return; @@ -172,7 +61,7 @@ namespace Luban.Job.Cfg.Validators } case DShort s: { - if (!CheckInLongRange(s.Value)) + if (!_range.CheckInLongRange(s.Value)) { LogError(); return; @@ -181,7 +70,7 @@ namespace Luban.Job.Cfg.Validators } case DInt i: { - if (!CheckInLongRange(i.Value)) + if (!_range.CheckInLongRange(i.Value)) { LogError(); return; @@ -190,7 +79,7 @@ namespace Luban.Job.Cfg.Validators } case DFint i: { - if (!CheckInLongRange(i.Value)) + if (!_range.CheckInLongRange(i.Value)) { LogError(); return; @@ -199,7 +88,7 @@ namespace Luban.Job.Cfg.Validators } case DLong l: { - if (!CheckInLongRange(l.Value)) + if (!_range.CheckInLongRange(l.Value)) { LogError(); return; @@ -208,7 +97,7 @@ namespace Luban.Job.Cfg.Validators } case DFlong fl: { - if (!CheckInLongRange(fl.Value)) + if (!_range.CheckInLongRange(fl.Value)) { LogError(); return; @@ -217,7 +106,7 @@ namespace Luban.Job.Cfg.Validators } case DFloat ff: { - if (!CheckInDoubleRange(ff.Value)) + if (!_range.CheckInDoubleRange(ff.Value)) { LogError(); return; @@ -226,7 +115,7 @@ namespace Luban.Job.Cfg.Validators } case DDouble dd: { - if (!CheckInDoubleRange(dd.Value)) + if (!_range.CheckInDoubleRange(dd.Value)) { LogError(); return; diff --git a/src/Luban.Job.Cfg/Source/Validators/SizeValidator.cs b/src/Luban.Job.Cfg/Source/Validators/SizeValidator.cs index 3aabf62..84f77e4 100644 --- a/src/Luban.Job.Cfg/Source/Validators/SizeValidator.cs +++ b/src/Luban.Job.Cfg/Source/Validators/SizeValidator.cs @@ -12,16 +12,16 @@ namespace Luban.Job.Cfg.Validators [Validator("size")] internal class SizeValidator : IValidator { - private readonly int _size; + private Range _range; public SizeValidator(TType type, string rule) { - this._size = int.Parse(rule); + _range = new Range(rule); } public void Compile(DefFieldBase def) { - + _range.Compile(); } private static string Source => ValidatorContext.CurrentVisitor.CurrentValidateRecord.Source; @@ -31,7 +31,7 @@ namespace Luban.Job.Cfg.Validators var assembly = ctx.Assembly; void LogError(int size) { - assembly.Agent.Error("记录 {0}:{1} (来自文件:{2}) size:{3},但要求为 {4} ", ValidatorContext.CurrentRecordPath, data, Source, size, _size); + assembly.Agent.Error("记录 {0}:{1} (来自文件:{2}) size:{3},但要求为 {4} ", ValidatorContext.CurrentRecordPath, data, Source, size, _range.RawStr); } if (type.IsNullable && data == null) @@ -43,7 +43,7 @@ namespace Luban.Job.Cfg.Validators { case DArray b: { - if (b.Datas.Count != _size) + if (!_range.CheckInLongRange(b.Datas.Count)) { LogError(b.Datas.Count); return; @@ -52,7 +52,7 @@ namespace Luban.Job.Cfg.Validators } case DList b: { - if (b.Datas.Count != _size) + if (!_range.CheckInLongRange(b.Datas.Count)) { LogError(b.Datas.Count); return; @@ -61,7 +61,7 @@ namespace Luban.Job.Cfg.Validators } case DSet b: { - if (b.Datas.Count != _size) + if (!_range.CheckInLongRange(b.Datas.Count)) { LogError(b.Datas.Count); return; @@ -70,7 +70,7 @@ namespace Luban.Job.Cfg.Validators } case DMap b: { - if (b.Datas.Count != _size) + if (!_range.CheckInLongRange(b.Datas.Count)) { LogError(b.Datas.Count); return; diff --git a/src/Luban.Job.Common/Source/Utils/DefUtil.cs b/src/Luban.Job.Common/Source/Utils/DefUtil.cs index 3ba7024..1d6fde0 100644 --- a/src/Luban.Job.Common/Source/Utils/DefUtil.cs +++ b/src/Luban.Job.Common/Source/Utils/DefUtil.cs @@ -81,7 +81,7 @@ namespace Luban.Job.Common.Utils { ++braceDepth; } - else if (c == ')' || c == ')' || c == '}') + else if (c == ')' || c == ']' || c == '}') { --braceDepth; } @@ -119,7 +119,7 @@ namespace Luban.Job.Common.Utils { ++braceDepth; } - else if (c == ')' || c == ')' || c == '}') + else if (c == ')' || c == ']' || c == '}') { --braceDepth; }