///|
/// Add a custom validation rule.
///
/// `check` is a predicate on the JSON value; `message` is the error message
/// shown when the predicate returns `false`.
pub fn Schema::refine(
  self : Schema,
  check : (Json) -> Bool,
  message : String,
) -> Schema {
  {
    ..self,
    id: new_schema_id(),
    rules: self.rules +
    [
      {
        check,
        message,
        code: IssueCode::Custom,
        annotation: Json::null(),
        constraint: Opaque,
        explicit_message: true,
      },
    ],
  }
}