holopy3/Assets/UniGLTF/UniJSON/Scripts/JsonSchemaValidator/JsonStringValidator.cs
Lena Biresch 490ef558ef CleanUp
2021-01-28 13:07:52 +01:00

141 lines
3.9 KiB
C#

using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace UniJSON
{
/// <summary>
/// http://json-schema.org/latest/json-schema-validation.html#string
/// </summary>
public class JsonStringValidator : IJsonSchemaValidator
{
/// <summary>
/// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.3.1
/// </summary>
public int? MaxLength
{
get; set;
}
/// <summary>
/// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.3.2
/// </summary>
public int? MinLength
{
get; set;
}
/// <summary>
/// http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.3.3
/// </summary>
public Regex Pattern
{
get; set;
}
public override int GetHashCode()
{
return 4;
}
public override bool Equals(object obj)
{
var rhs = obj as JsonStringValidator;
if (rhs == null) return false;
if (MaxLength != rhs.MaxLength) return false;
if (MinLength != rhs.MinLength) return false;
if (Pattern == null && rhs.Pattern == null)
{
}
else if (Pattern == null)
{
return false;
}
else if (rhs.Pattern == null)
{
return false;
}
else if (Pattern.ToString() != rhs.Pattern.ToString())
{
return false;
}
return true;
}
public void Assign(IJsonSchemaValidator obj)
{
var rhs = obj as JsonStringValidator;
if (rhs == null)
{
throw new ArgumentException();
}
MaxLength = rhs.MaxLength;
MinLength = rhs.MinLength;
Pattern = rhs.Pattern;
}
public bool Parse(IFileSystemAccessor fs, string key, JsonNode value)
{
switch (key)
{
case "maxLength":
MaxLength = value.GetInt32();
return true;
case "minLength":
MinLength = value.GetInt32();
return true;
case "pattern":
Pattern = new Regex(value.GetString().Replace("\\\\", "\\"));
return true;
}
return false;
}
public JsonSchemaValidationException Validate(JsonSchemaValidationContext c, object o)
{
if (o == null)
{
return new JsonSchemaValidationException(c, "null");
}
var value = o as string;
if (value.All(x => Char.IsWhiteSpace(x)))
{
return new JsonSchemaValidationException(c, "whitespace");
}
if (MinLength.HasValue && value.Length < MinLength)
{
return new JsonSchemaValidationException(c, string.Format("minlength: {0}<{1}", value.Length, MinLength.Value));
}
if (MaxLength.HasValue && value.Length > MaxLength)
{
return new JsonSchemaValidationException(c, string.Format("maxlength: {0}>{1}", value.Length, MaxLength.Value));
}
if(Pattern!=null && !Pattern.IsMatch(value))
{
return new JsonSchemaValidationException(c, string.Format("pattern: {0} not match {1}", Pattern, value));
}
return null;
}
public void Serialize(JsonFormatter f, JsonSchemaValidationContext c, object o)
{
f.Value((string)o);
}
public void ToJson(JsonFormatter f)
{
f.Key("type"); f.Value("string");
}
}
}