19 #ifndef IRCCD_JS_DUK_HPP
20 #define IRCCD_JS_DUK_HPP
32 #include <string_view>
62 duk_context* context_;
76 stack_guard(duk_context* ctx,
unsigned expected = 0) noexcept;
97 std::unique_ptr<duk_context, void (*)(duk_context*)> handle_;
100 void operator=(
const context&) =
delete;
118 operator duk_context*() noexcept;
125 operator duk_context*()
const noexcept;
147 std::string message_;
149 std::string file_name_;
150 unsigned line_number_;
165 std::string file_name,
166 unsigned line_number = 0) noexcept;
173 auto get_name()
const noexcept ->
const std::string&;
180 auto get_message()
const noexcept ->
const std::string&;
187 auto get_stack()
const noexcept ->
const std::string&;
208 auto what()
const noexcept ->
const char*
override;
253 template <
typename T>
269 template <
typename T>
270 auto push(duk_context* ctx, T&& value) ->
int
272 using Type =
typename std::decay<T>::type;
292 template <
typename T>
293 auto get(duk_context* ctx, duk_idx_t index)
295 using Type =
typename std::decay<T>::type;
313 template <
typename T>
314 auto require(duk_context* ctx, duk_idx_t index)
316 using Type =
typename std::decay<T>::type;
331 int type_{DUK_ERR_ERROR};
332 std::string message_;
342 error(
int type, std::string message) noexcept;
350 error(std::string message) noexcept;
363 void create(duk_context* ctx)
const;
486 template <
typename Error>
487 void raise(duk_context* ctx, Error&&
error)
489 using type = std::decay_t<Error>;
507 auto get_stack(duk_context* ctx,
int index,
bool pop =
true) -> stack_info;
524 static void raise(duk_context* ctx,
const std::exception& ex);
542 static void raise(duk_context* ctx,
const error& ex);
562 static void push(duk_context* ctx,
bool value);
573 static auto get(duk_context* ctx, duk_idx_t index) -> bool;
584 static auto require(duk_context* ctx, duk_idx_t index) -> bool;
604 static void push(duk_context* ctx, duk_double_t value);
615 static auto get(duk_context* ctx, duk_idx_t index) -> duk_double_t;
626 static auto require(duk_context* ctx, duk_idx_t index) -> duk_double_t;
646 static void push(duk_context* ctx, duk_int_t value);
657 static auto get(duk_context* ctx, duk_idx_t index) -> duk_int_t;
668 static auto require(duk_context* ctx, duk_idx_t index) -> duk_int_t;
688 static void push(duk_context* ctx, duk_uint_t value);
699 static auto get(duk_context* ctx, duk_idx_t index) -> duk_uint_t;
710 static auto require(duk_context* ctx, duk_idx_t index) -> duk_uint_t;
730 static void push(duk_context* ctx,
const char* value);
741 static auto get(duk_context* ctx, duk_idx_t index) ->
const char*;
752 static auto require(duk_context* ctx, duk_idx_t index) ->
const char*;
772 static void push(duk_context* ctx,
const std::string& value);
783 static auto get(duk_context* ctx, duk_idx_t index) -> std::string;
794 static auto require(duk_context* ctx, duk_idx_t index) -> std::string;
814 static void push(duk_context* ctx, std::string_view value);
825 static auto get(duk_context* ctx, duk_idx_t index) -> std::string_view;
836 static auto require(duk_context* ctx, duk_idx_t index) -> std::string_view;
846 template <
typename T>
854 static void push(duk_context* ctx,
const std::vector<T>& values)
858 for (std::size_t i = 0; i < values.size(); ++i) {
860 duk_put_prop_index(ctx, -2, i);
871 static auto get(duk_context* ctx, duk_idx_t index) -> std::vector<T>
873 const auto length = duk_get_length(ctx, index);
875 std::vector<T> result;
877 result.reserve(length);
879 for (
auto i = 0U; i < length; ++i) {
880 duk_get_prop_index(ctx, index, i);
897 #endif // !IRCCD_JS_DUK_HPP