export module runtime; import app; import app.sdl; import core; import core.math; import core.sequence; import kym; import kym.environment; extern "C" int main(int argc, char const * const * argv) { return app::display("Ona Runtime", [](app::system & system, app::graphics & graphics) -> int { constexpr app::path config_path = app::path::empty().joined("config.kym"); bool is_config_loaded = false; system.bundle().read_file(config_path, [&](core::readable const & config_readable) { kym::vm vm{&system.thread_safe_allocator(), [&system](core::slice const & error_message) { system.log(app::log_level::error, error_message); }}; if (!vm.init({ .datastack_size = 64, .callstack_size = 64, })) { system.log(app::log_level::error, "failed to allocate memory for config vm"); return; } core::stack config_source{&system.thread_safe_allocator()}; core::u8 config_source_stream_buffer[1024] = {}; if (!core::stream(core::sequence_writer{&config_source}, config_readable, config_source_stream_buffer).has_value()) return; vm.with_object(vm.compile(config_source.as_slice().as_chars()), [&](kym::bound_object & config_script) { vm.with_object(config_script.call({}), [&](kym::bound_object & config) { core::u16 const width = config.get_field("width").as_u16().value_or(0); if (width == 0) return system.log( app::log_level::error, "failed to decode `width` property of config"); core::u16 const height = config.get_field("height").as_u16().value_or(0); if (height == 0) return system.log( app::log_level::error, "failed to decode `height` property of config"); graphics.show(width, height); vm.with_object(config.get_field("title"), [&](kym::bound_object & title) { core::stack title_buffer{&system.thread_safe_allocator()}; if (!title.is_string()) return system.log( app::log_level::error, "failed to decode `title` property of config"); title.stringify(core::sequence_writer(&title_buffer)); is_config_loaded = true; }); }); }); }); if (!is_config_loaded) { system.log(app::log_level::error, "failed to load config"); return core::u8_max; } // app::canvas canvas_2d(); while (system.poll()) { // canvas_2d.render(graphics); graphics.present(); } return 0; }); }