const std = @import("std"); const Io = std.Io; const fern = @import("fern"); const maivi = @import("maivi"); const Lua = maivi.lua.Lua; pub fn main(init: std.process.Init) !void { const config: maivi.Config = try .init(init.io, init.arena, init.environ_map); maivi.allocator = init.gpa; maivi.config = &config; try fern.init(init.io, maivi.allocator, .{ .level = .info, }); defer fern.deinit(); maivi.data.init(); defer maivi.data.deinit(); try maivi.lua.init(); defer maivi.lua.deinit(); var args = init.minimal.args.iterate(); _ = args.skip(); eval(maivi.lua.lua, init.io, init.arena.allocator(), &args) catch |e| switch (e) { error.NoArgs => std.debug.print("USAGE: nlua0 script.lua args...\n\n", .{}), else => return e, }; } pub fn eval(l: *Lua, io: Io, _: std.mem.Allocator, args: *std.process.Args.Iterator) !void { const firstarg = blk: { const first = args.next(); if (first) |arg| if (std.mem.eql(u8, arg, "-l")) break :blk args.next(); break :blk first; } orelse return error.NoArgs; // assumes posix args l.createTable(@intCast(args.inner.remaining.len), 1); _ = l.pushString(firstarg); l.setIndexRaw(-2, 1); var i: i32 = 2; while (args.next()) |arg| : (i += 1) { _ = l.pushString(arg); l.setIndexRaw(-2, i); } l.setGlobal("args"); _ = l.getGlobal("debug"); _ = l.getField(-1, "traceback"); const contents = try maivi.helpers.read_file(io, maivi.allocator, Io.Dir.cwd(), firstarg); defer maivi.allocator.free(contents); try l.loadBuffer(contents, firstarg); l.protectedCall(.{ .msg_handler = -2 }) catch |e| { if (e == error.LuaRuntime) { const msg = try l.toString(-1); std.debug.print("{s}\n", .{msg}); } return e; }; }