summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Controllers/JsonValidatorController.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-08-04 18:01:05 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-09-14 19:00:54 -0400
commitee0ff5687d4002aab20cd91fd28d007d916af36c (patch)
tree113b44f267630804d0b0c3408800733290b5331f /src/SMAPI.Web/Controllers/JsonValidatorController.cs
parentf24e7428df15ee8bcc9a2a45de98363670e72231 (diff)
downloadSMAPI-ee0ff5687d4002aab20cd91fd28d007d916af36c.tar.gz
SMAPI-ee0ff5687d4002aab20cd91fd28d007d916af36c.tar.bz2
SMAPI-ee0ff5687d4002aab20cd91fd28d007d916af36c.zip
add user-friendly doc link & error messages, document validator, improve manifest schema (#654)
Diffstat (limited to 'src/SMAPI.Web/Controllers/JsonValidatorController.cs')
-rw-r--r--src/SMAPI.Web/Controllers/JsonValidatorController.cs49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/SMAPI.Web/Controllers/JsonValidatorController.cs b/src/SMAPI.Web/Controllers/JsonValidatorController.cs
index 37393a98..7b755d3b 100644
--- a/src/SMAPI.Web/Controllers/JsonValidatorController.cs
+++ b/src/SMAPI.Web/Controllers/JsonValidatorController.cs
@@ -113,6 +113,9 @@ namespace StardewModdingAPI.Web.Controllers
schema = JSchema.Parse(System.IO.File.ReadAllText(schemaFile.FullName));
}
+ // get format doc URL
+ result.FormatUrl = this.GetExtensionField<string>(schema, "@documentationUrl");
+
// validate JSON
parsed.IsValid(schema, out IList<ValidationError> rawErrors);
var errors = rawErrors
@@ -172,13 +175,22 @@ namespace StardewModdingAPI.Web.Controllers
/// <param name="indent">The indentation level to apply for inner errors.</param>
private string GetFlattenedError(ValidationError error, int indent = 0)
{
+ // get override error
+ string message = this.GetOverrideError(error.Schema, error.ErrorType);
+ if (message != null)
+ return message;
+
// get friendly representation of main error
- string message = error.Message;
+ message = error.Message;
switch (error.ErrorType)
{
case ErrorType.Enum:
message = $"Invalid value. Found '{error.Value}', but expected one of '{string.Join("', '", error.Schema.Enum)}'.";
break;
+
+ case ErrorType.Required:
+ message = $"Missing required fields: {string.Join(", ", (List<string>)error.Value)}.";
+ break;
}
// add inner errors
@@ -216,5 +228,40 @@ namespace StardewModdingAPI.Web.Controllers
return null;
}
+
+ /// <summary>Get an override error from the JSON schema, if any.</summary>
+ /// <param name="schema">The schema or subschema that raised the error.</param>
+ /// <param name="errorType">The error type.</param>
+ private string GetOverrideError(JSchema schema, ErrorType errorType)
+ {
+ // get override errors
+ IDictionary<string, string> errors = this.GetExtensionField<Dictionary<string, string>>(schema, "@errorMessages");
+ if (errors == null)
+ return null;
+ errors = new Dictionary<string, string>(errors, StringComparer.InvariantCultureIgnoreCase);
+
+ // get matching error
+ return errors.TryGetValue(errorType.ToString(), out string errorPhrase)
+ ? errorPhrase
+ : null;
+ }
+
+ /// <summary>Get an extension field from a JSON schema.</summary>
+ /// <typeparam name="T">The field type.</typeparam>
+ /// <param name="schema">The schema whose extension fields to search.</param>
+ /// <param name="key">The case-insensitive field key.</param>
+ private T GetExtensionField<T>(JSchema schema, string key)
+ {
+ if (schema.ExtensionData != null)
+ {
+ foreach (var pair in schema.ExtensionData)
+ {
+ if (pair.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase))
+ return pair.Value.ToObject<T>();
+ }
+ }
+
+ return default;
+ }
}
}