#pragma once

#include <cstdlib>
#include <print>
#include <stacktrace>
#include <string>

namespace kuiper
{

#define KUIPER_ASSERT(cond)                                                   \
    if (!(cond)) {                                                            \
        std::println(stderr, "Assertion failed at: {}", __PRETTY_FUNCTION__); \
        std::abort();                                                         \
    }

#define KUIPER_ASSERT_STACKTRACE(cond)                                        \
    if (!(cond)) {                                                            \
        const auto trace = std::stacktrace::current();                        \
        std::println(stderr, "Assertion failed at: {}", __PRETTY_FUNCTION__); \
        std::println(stderr, "{}", std::to_string(trace));                    \
        std::abort();                                                         \
    }

} // namespace kuiper