%--------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 1993-1999, 2003, 2005-2006, 2010-2011 The University of Melbourne.
% Copyright (C) 2014-2016, 2018, 2021-2023, 2025 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: require.m.
% Main author: fjh.
% Stability: high.
%
% This module provides features similar to <assert.h> in C.
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module require.
:- interface.
% error(Message):
%
% Throw a `software_error(Message)' exception.
% This will normally cause execution to abort with an error message.
%
:- pred error(string::in) is erroneous.
% func_error(Message):
%
% An expression that results in a `software_error(Message)'
% exception being thrown.
%
:- func func_error(string) = _ is erroneous.
% error(Pred, Message):
% func_error(Pred, Message):
%
% Equivalent to invoking error or func_error on the string
% Pred ++ ": " ++ Message.
%
:- pred error(string::in, string::in) is erroneous.
:- func func_error(string, string) = _ is erroneous.
% We declare error to be terminating so that all of the standard library
% will treat it as terminating.
:- pragma terminates(pred(error/1)).
:- pragma terminates(pred(error/2)).
:- pragma terminates(func(func_error/1)).
:- pragma terminates(func(func_error/2)).
%--------------------------------------------------%
% sorry(Module, What):
%
% Call error/1 with the string
% "Module: Sorry, not implemented: What".
%
% Use this for features that should be implemented (or at least could be
% implemented).
%
:- func sorry(string, string) = _ is erroneous.
:- pred sorry(string::in, string::in) is erroneous.
% sorry(Module, Proc, What):
%
% Call error/1 with the string
% "Module: Proc: Sorry, not implemented: What".
%
% Use this for features that should be implemented,
% or at least could be implemented.
%
:- func sorry(string, string, string) = _ is erroneous.
:- pred sorry(string::in, string::in, string::in) is erroneous.
% unexpected(Module, Message):
%
% Call error/1 with the string
% "Module: Unexpected: What".
%
% Use this to handle cases which are not expected to arise (i.e. bugs).
%
:- func unexpected(string, string) = _ is erroneous.
:- pred unexpected(string::in, string::in) is erroneous.
% unexpected(Module, Proc, Message):
%
% Call error/1 with the string
% "Module: Proc: Unexpected: What".
%
% Use this to handle cases which are not expected to arise (i.e. bugs).
%
:- func unexpected(string, string, string) = _ is erroneous.
:- pred unexpected(string::in, string::in, string::in) is erroneous.
%--------------------------------------------------%
% require(Goal, Message):
%
% Call goal, and call error(Message) if Goal fails.
% This is not as useful as you might imagine, since it requires
% that the goal not produce any output variables. In most circumstances,
% you should use an explicit if-then-else with a call to error/1,
% or one of its wrappers, in the "else".
%
:- pred require((pred)::in((pred) is semidet), string::in) is det.
% expect(Goal, Module, Message):
%
% Call Goal, and call unexpected(Module, Message) if Goal fails.
%
:- pred expect((pred)::in((pred) is semidet), string::in, string::in) is det.
% expect(Goal, Module, Proc, Message):
%
% Call Goal, and call unexpected(Module, Proc, Message) if Goal fails.
%
:- pred expect((pred)::in((pred) is semidet), string::in, string::in,
string::in) is det.
% expect_not(Goal, Module, Message):
%
% Call Goal, and call unexpected(Module, Message) if Goal succeeds.
%
:- pred expect_not((pred)::in((pred) is semidet), string::in, string::in)
is det.
% expect_not(Goal, Module, Proc, Message):
%
% Call Goal, and call unexpected(Module, Proc, Message) if Goal succeeds.
%
:- pred expect_not((pred)::in((pred) is semidet), string::in, string::in,
string::in) is det.
%--------------------------------------------------%
% report_lookup_error(Message, Key):
%
% Call error/1 with an error message that is appropriate for
% the failure of a lookup operation involving the specified Key.
% The error message will include Message and information about Key.
%
:- pred report_lookup_error(string::in, K::in) is erroneous.
% report_lookup_error(Message, Key, Value):
%
% Call error/1 with an error message that is appropriate for
% the failure of a lookup operation involving the specified Key and Value.
% The error message will include Message and information about Key
% and Value.
%
:- pred report_lookup_error(string::in, K::in, V::unused) is erroneous.
%--------------------------------------------------%
%--------------------------------------------------%