ona/source/runner.zig

118 lines
3.0 KiB
Zig
Executable File

const coral = @import("coral");
const kym = @import("kym");
const ona = @import("ona");
const transform_typeid = @typeName(ona.canvas.Transform);
fn new_canvas_item(environment: *kym.vm.Environment, canvas_item: ona.CanvasItem) !*kym.vm.Object {
const typeid = @typeName(ona.CanvasItem);
var object = try environment.new(.{
.userdata = coral.io.bytes_of(&canvas_item),
.identity = typeid,
});
errdefer environment.release(object);
return object;
}
fn new_transform(environment: *kym.Environment, transform: ona.canvas.Transform) !*kym.vm.Object {
var object = try environment.new(.{
.userdata = coral.io.bytes_of(&transform),
.identity = transform_typeid,
});
errdefer environment.release(object);
return object;
}
pub fn main() anyerror!void {
return ona.App.run(anyerror, start);
}
fn start(app: *ona.App) anyerror!void {
var kym_environment = try kym.vm.Environment.init(ona.allocator, .{
.stack_max = 256,
.calls_max = 256,
});
defer kym_environment.deinit();
const Ona = struct {
app: *ona.App,
const typeid = @typeName(ona.App);
};
var ona_lib = try kym_environment.new(.{
.userdata = coral.io.bytes_of(&Ona{
.app = app,
}),
.identity = Ona.typeid,
});
defer kym_environment.release(ona_lib);
try kym_environment.global_set("ona", ona_lib.as_value());
{
var sprite_creator = try kym_environment.new(.{.behavior = &.{.caller = struct {
fn call(context: kym.vm.Object.CallContext) kym.vm.RuntimeError!kym.vm.Value {
try context.env.check(context.args.len == 2, "2 arguments expected");
var item = try ona.CanvasItem.init((try context.env.user_cast(context.caller, Ona.typeid, Ona)).app, .{
.transform = (try context.env.user_cast(context.args[0].object, transform_typeid, ona.canvas.Transform)).*,
.options = .{.sprite = .{}},
});
errdefer item.deinit();
return (try new_canvas_item(context.env, item)).as_value();
}
}.call}});
defer kym_environment.release(sprite_creator);
try kym_environment.raw_set(ona_lib, "create_sprite", sprite_creator.as_value());
}
{
const index_path = "index.kym";
const index_file = try app.data_fs().open_readable(index_path);
defer if (!index_file.close()) ona.log_error(&.{.{.string = "failed to close "}, .{.string = index_path}});
const index_size = (try app.data_fs().query(index_path)).size;
const index_allocation = try coral.io.allocate_many(u8, index_size, ona.allocator);
defer coral.io.deallocate(ona.allocator, index_allocation);
var index_buffer = coral.buffer.Fixed{.data = index_allocation[0 .. index_size]};
{
var stream_buffer = [_]u8{0} ** 1024;
if ((try coral.io.stream(index_buffer.as_writer(), index_file.as_reader(), &stream_buffer)) != index_size)
return error.IoUnavailable;
}
{
const index_script = try kym_environment.new_script(.{
.name = index_path,
.data = index_buffer.data
});
defer kym_environment.release(index_script);
_ = try kym_environment.call(index_script, &.{});
}
}
app.loop();
}