luban/src/Luban.Job.Cfg/Source/Validators/Range.cs

146 lines
3.5 KiB
C#

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;
}
}
}