#pragma once

#include <string>
#include <fmt/core.h>
#include <functional>

using std::string;

namespace dbc {
  class Error {
    public:
      const string message;
      Error(string m) : message{m} {}
      Error(const char *m) : message{m} {}
  };

  class CheckError : public Error {};
  class SentinelError : public Error {};
  class PreCondError : public Error {};
  class PostCondError : public Error {};

  void log(const string &message);
  [[noreturn]] void sentinel(const string &message);
  void pre(const string &message, bool test);
  void pre(const string &message, std::function<bool()> tester);
  void post(const string &message, bool test);
  void post(const string &message, std::function<bool()> tester);
  void check(bool test, const string &message);
}