#pragma once

#include <exception>

namespace teqp {

    class teqpcException : public std::exception {
    public:
        const int code;
        const std::string msg;
        teqpcException(int code, const std::string& msg) : code(code), msg(msg) {};
        const char* what() const noexcept override {
            return msg.c_str();
        }
    };

    class teqpException : public std::exception {
    protected:
        const int code;
        const std::string msg;
        teqpException(int code, const std::string& msg) : code(code), msg(msg) {};
        const char* what() const noexcept override {
            return msg.c_str();
        }
    };

    // Exceptions related to arguments
    class InvalidArgument : public teqpException {
    public:
        InvalidArgument(const std::string& msg) : teqpException(1, msg) {};
    };

    // Exceptions related to calculations
    class IterationFailure : public teqpException {
    public:
        IterationFailure(const std::string& msg) : teqpException(100, msg) {};
    };

}; // namespace teqp