///|
/// Example:
/// ```
/// let jsonschema : Json = { "type": "string" }
/// let validator = build_validator(jsonschema)
/// let _result = validator.validate("hello")
/// ```
pub fn build_validator(raw : Json) -> Validator raise {
  let schema : JsonSchema = @json.from_json(raw) catch {
    err => raise ParseError::JsonDecodeError(err)
  }
  let resolver = Resolver::new(raw)
  Validator::{ schema, resolver }
}

///|
struct Validator {
  schema : JsonSchema
  resolver : Resolver
}

///|
pub fn Validator::validate(
  self : Validator,
  input : Json,
) -> Result[Unit, Array[ValidationError]] {
  let errors = self.schema.validate(
    input,
    resolver=self.resolver,
    json_path=JsonPointer::Root,
    schema_path=JsonPointer::Root,
  )
  // let errors = self.schema.validate(input, self.resolver)
  if errors.length() == 0 {
    Ok(())
  } else {
    Err(errors)
  }
}