anchor.diff:  %% to the caller, otherwise an error with an appropriate error reason
   %% is returned.
   -spec validate(Schema :: any(), Data :: json_term()) -> {ok, json_term()}
  -                                                      | {error, term()}.
  +                                                      | error().
   validate(Schema, Data) ->
     try
       JsonSchema = jesse_database:read(Schema),
  
positive.code: del_schema(Key) ->
    jesse_database:delete(Key).
  
  %% @doc Updates schema definitions in in-memory storage.
  %%
  %% Equivalent to `update_schema(Path, ParseFun, ValidationFun, MakeKeyFun)'
  %% where `ValidationFun' is `fun jesse_json:is_json_object/1' and
  %% `MakeKeyFun' is `fun jesse_schema_validator:get_schema_id/1'.
  -spec update_schema( Path     :: string()
                     , ParseFun :: fun((binary()) -> json_term())
                     ) -> jesse_database:update_result().
  update_schema(Path, ParseFun) ->
    update_schema( Path
                 , ParseFun
                 , fun jesse_schema_validator:is_json_object/1
                 , fun jesse_schema_validator:get_schema_id/1
                 ).
  
  %% @doc Updates schema definitions in in-memory storage. The function loads all
  %% the files from directory `Path', then each schema entry will be checked
  %% for a validity by function `ValidationFun', and will be stored in in-memory
  %% storage with a key returned by `MakeKeyFun' function.
  %%
  %% In addition to a schema definition, a timestamp of the schema file will be
  %% stored, so, during the next update timestamps will be compared to avoid
  
negative.code: -export([ add_schema/2
          , add_schema/3
          , del_schema/1
          , load_schemas/2
          , load_schemas/4
          , validate/2
          , validate/3
          , validate_with_schema/2
  