/Manatee.Json/Schema/Formats/Formats.cs

https://github.com/gregsdennis/Manatee.Json · C# · 144 lines · 67 code · 9 blank · 68 comment · 6 complexity · 16964762b40dc0805bd32c46efbb67e4 MD5 · raw file

  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Linq;
  4. namespace Manatee.Json.Schema
  5. {
  6. /// <summary>
  7. /// Defines various formats used for <see cref="FormatKeyword"/> validation.
  8. /// </summary>
  9. /// <remarks>
  10. /// Any of these may be overridden by creating a new instance with the same key.
  11. /// </remarks>
  12. public static class Formats
  13. {
  14. private static readonly ConcurrentDictionary<string, IFormatValidator> _lookup;
  15. /// <summary>
  16. /// Gets the `date` format.
  17. /// </summary>
  18. public static IFormatValidator? Date => GetFormat(DateFormatValidator.Instance.Format);
  19. /// <summary>
  20. /// Gets the `date-time` format.
  21. /// </summary>
  22. public static IFormatValidator? DateTime => GetFormat(DateTimeFormatValidator.Instance.Format);
  23. /// <summary>
  24. /// Gets the `duration` format.
  25. /// </summary>
  26. public static IFormatValidator? Duration => GetFormat(DurationFormatValidator.Instance.Format);
  27. /// <summary>
  28. /// Gets the `email` format.
  29. /// </summary>
  30. public static IFormatValidator? Email => GetFormat(EmailFormatValidator.Instance.Format);
  31. /// <summary>
  32. /// Gets the `hostname` format.
  33. /// </summary>
  34. public static IFormatValidator? HostName => GetFormat(HostNameFormatValidator.Instance.Format);
  35. /// <summary>
  36. /// Gets the `ipv4` format.
  37. /// </summary>
  38. public static IFormatValidator? Ipv4 => GetFormat(Ipv4FormatValidator.Instance.Format);
  39. /// <summary>
  40. /// Gets the `ipv6` format.
  41. /// </summary>
  42. public static IFormatValidator? Ipv6 => GetFormat(Ipv6FormatValidator.Instance.Format);
  43. /// <summary>
  44. /// Gets the `iri` format.
  45. /// </summary>
  46. public static IFormatValidator? Iri => GetFormat(IriFormatValidator.Instance.Format);
  47. /// <summary>
  48. /// Gets the `iri-reference` format.
  49. /// </summary>
  50. public static IFormatValidator? IriReference => GetFormat(IriReferenceFormatValidator.Instance.Format);
  51. /// <summary>
  52. /// Gets the `json-pointer` format.
  53. /// </summary>
  54. public static IFormatValidator? JsonPointer => GetFormat(JsonPointerFormatValidator.Instance.Format);
  55. /// <summary>
  56. /// Gets the `regex` format.
  57. /// </summary>
  58. public static IFormatValidator? Regex => GetFormat(RegexFormatValidator.Instance.Format);
  59. /// <summary>
  60. /// Gets the `relative-json-pointer` format.
  61. /// </summary>
  62. public static IFormatValidator? RelativeJsonPointer => GetFormat(RelativeJsonPointerFormatValidator.Instance.Format);
  63. /// <summary>
  64. /// Gets the `uri` format.
  65. /// </summary>
  66. public static IFormatValidator? Uri => GetFormat(UriFormatValidator.Instance.Format);
  67. /// <summary>
  68. /// Gets the `uri-reference` format.
  69. /// </summary>
  70. public static IFormatValidator? UriReference => GetFormat(UriReferenceFormatValidator.Instance.Format);
  71. /// <summary>
  72. /// Gets the `uri-template` format.
  73. /// </summary>
  74. public static IFormatValidator? UriTemplate => GetFormat(UriTemplateFormatValidator.Instance.Format);
  75. /// <summary>
  76. /// Gets the `uuid` format.
  77. /// </summary>
  78. public static IFormatValidator? Uuid => GetFormat(UuidReferenceFormatValidator.Instance.Format);
  79. static Formats()
  80. {
  81. _lookup = new ConcurrentDictionary<string, IFormatValidator>
  82. {
  83. [DateFormatValidator.Instance.Format] = DateFormatValidator.Instance,
  84. [DateTimeFormatValidator.Instance.Format] = DateTimeFormatValidator.Instance,
  85. [DurationFormatValidator.Instance.Format] = DurationFormatValidator.Instance,
  86. [EmailFormatValidator.Instance.Format] = EmailFormatValidator.Instance,
  87. [HostNameFormatValidator.Instance.Format] = HostNameFormatValidator.Instance,
  88. [Ipv4FormatValidator.Instance.Format] = Ipv4FormatValidator.Instance,
  89. [Ipv6FormatValidator.Instance.Format] = Ipv6FormatValidator.Instance,
  90. [IriFormatValidator.Instance.Format] = IriFormatValidator.Instance,
  91. [IriReferenceFormatValidator.Instance.Format] = IriReferenceFormatValidator.Instance,
  92. [JsonPointerFormatValidator.Instance.Format] = JsonPointerFormatValidator.Instance,
  93. [RegexFormatValidator.Instance.Format] = RegexFormatValidator.Instance,
  94. [RelativeJsonPointerFormatValidator.Instance.Format] = RelativeJsonPointerFormatValidator.Instance,
  95. [UriFormatValidator.Instance.Format] = UriFormatValidator.Instance,
  96. [UriReferenceFormatValidator.Instance.Format] = UriReferenceFormatValidator.Instance,
  97. [UriTemplateFormatValidator.Instance.Format] = UriTemplateFormatValidator.Instance,
  98. [UuidReferenceFormatValidator.Instance.Format] = UuidReferenceFormatValidator.Instance
  99. };
  100. }
  101. /// <summary>
  102. /// Gets a <see cref="IFormatValidator"/> object based on a format key.
  103. /// </summary>
  104. /// <param name="formatKey">The predefined key for the format.</param>
  105. /// <returns>A <see cref="IFormatValidator"/> object, or null if none exists for the key.</returns>
  106. public static IFormatValidator? GetFormat(string formatKey)
  107. {
  108. if (formatKey == null)
  109. throw new ArgumentNullException(nameof(formatKey));
  110. _lookup.TryGetValue(formatKey, out var format);
  111. return format;
  112. //: new Format(formatKey, JsonSchemaVersion.None, s => JsonSchemaOptions.AllowUnknownFormats) {IsKnown = false};
  113. }
  114. /// <summary>
  115. /// Adds a validator to the library. This will override any existing validators for the same key.
  116. /// </summary>
  117. /// <param name="validator">The validator to add.</param>
  118. public static void RegisterFormat(IFormatValidator validator)
  119. {
  120. if (validator == null)
  121. throw new ArgumentNullException(nameof(validator));
  122. _lookup[validator.Format] = validator;
  123. }
  124. /// <summary>
  125. /// Removes support for the given format.
  126. /// </summary>
  127. /// <param name="formatKey">The format key.</param>
  128. public static void UnregisterFormat(string formatKey)
  129. {
  130. if (formatKey == null)
  131. throw new ArgumentNullException(nameof(formatKey));
  132. _lookup.TryRemove(formatKey, out _);
  133. }
  134. }
  135. }