 }
 
 
-func validateURI(_ context: Context, _ value: Any) -> AnySequence<ValidationError> {
-  if let uri = value as? String {
-    // Using the regex from http://blog.dieweltistgarnichtso.net/constructing-a-regular-expression-that-matches-uris
+func validateJSONPointer(_ context: Context, _ value: String) -> AnySequence<ValidationError> {
+  guard !value.isEmpty else {
+    return AnySequence(EmptyCollection())
+  }
 
-    if let expression = try? NSRegularExpression(pattern: "((?<=\\()[A-Za-z][A-Za-z0-9\\+\\.\\-]*:([A-Za-z0-9\\.\\-_~:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]|%[A-Fa-f0-9]{2})+(?=\\)))|([A-Za-z][A-Za-z0-9\\+\\.\\-]*:([A-Za-z0-9\\.\\-_~:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]|%[A-Fa-f0-9]{2})+)", options: NSRegularExpression.Options(rawValue: 0)) {
-      let result = expression.matches(in: uri, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, uri.count))
-      if result.count == 1 {
-        let foundRange = result[0].range
-        if foundRange.location == 0 && foundRange.length == uri.count {
-          return AnySequence(EmptyCollection())
-        }
-      }
-    }
-
+  if !value.hasPrefix("/") {
     return AnySequence([
       ValidationError(
-        "'\(uri)' is not a valid uri.",
+        "'\(value)' is not a valid json-pointer.",
+        instanceLocation: context.instanceLocation,
+        keywordLocation: context.keywordLocation
+      )
+    ])
+  }
+
+  if value
+      .replacingOccurrences(of: "~0", with: "")
+      .replacingOccurrences(of: "~1", with: "")
+      .contains("~")
+  {
+    // unescaped ~
+    return AnySequence([
+      ValidationError(
+        "'\(value)' is not a valid json-pointer.",
         instanceLocation: context.instanceLocation,
         keywordLocation: context.keywordLocation
       )

}



func validateIPv6(_ context: Context, _ value: Any) -> AnySequence<ValidationError> {
  if let ipv6 = value as? String {
    if !ipv6.contains("%") {
      var buf = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN))
      if inet_pton(AF_INET6, ipv6, &buf) == 1 {
        return AnySequence(EmptyCollection())
      }
    }

    return AnySequence([
      ValidationError(
        "'\(ipv6)' is not a IPv6 address.",
        instanceLocation: context.instanceLocation,
        keywordLocation: context.keywordLocation
      )

}


func validateIPv4(_ context: Context, _ value: String) -> AnySequence<ValidationError> {
  if let expression = try? NSRegularExpression(pattern: "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", options: NSRegularExpression.Options(rawValue: 0)) {
    if expression.matches(in: value, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, value.utf16.count)).count == 1 {
      return AnySequence(EmptyCollection())
    }
  }

  return AnySequence([
    ValidationError(
      "'\(value)' is not a IPv4 address.",
      instanceLocation: context.instanceLocation,
      keywordLocation: context.keywordLocation
    )
  ])
}


func validateIPv6(_ context: Context, _ value: String) -> AnySequence<ValidationError> {
  if !value.contains("%") {
    var buf = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN))
    if inet_pton(AF_INET6, value, &buf) == 1 {
      return AnySequence(EmptyCollection())
    }
  }

  return AnySequence([
    ValidationError(
      "'\(value)' is not a value address.",
      instanceLocation: context.instanceLocation,
      keywordLocation: context.keywordLocation
    )
  ])
}


func validateURI(_ context: Context, _ value: String) -> AnySequence<ValidationError> {
  // Using the regex from http://blog.dieweltistgarnichtso.net/constructing-a-regular-expression-that-matches-uris

  if let expression = try? NSRegularExpression(pattern: "((?<=\\()[A-Za-z][A-Za-z0-9\\+\\.\\-]*:([A-Za-z0-9\\.\\-_~:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]|%[A-Fa-f0-9]{2})+(?=\\)))|([A-Za-z][A-Za-z0-9\\+\\.\\-]*:([A-Za-z0-9\\.\\-_~:/\\?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]|%[A-Fa-f0-9]{2})+)", options: NSRegularExpression.Options(rawValue: 0)) {
    let result = expression.matches(in: value, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, value.utf16.count))
    if result.count == 1 {
      let foundRange = result[0].range
      if foundRange.location == 0 && foundRange.length == value.utf16.count {
        return AnySequence(EmptyCollection())
      }
    }
  }

  return AnySequence([
    ValidationError(
      "'\(value)' is not a valid uri.",
      instanceLocation: context.instanceLocation,
      keywordLocation: context.keywordLocation
    )
  ])
}


func validateUUID(_ context: Context, _ value: String) -> AnySequence<ValidationError> {
  if UUID(uuidString: value) == nil {
    return AnySequence([
      ValidationError(
        "'\(value)' is not a valid uuid.",
        instanceLocation: context.instanceLocation,
        keywordLocation: context.keywordLocation
      )
