add a basic filesystem library and use it for path concat

This commit is contained in:
Squibid 2025-10-22 22:40:19 -04:00
parent 9e55195f8d
commit 8e4f56d147
Signed by: squibid
GPG key ID: BECE5684D3C4005D
3 changed files with 52 additions and 3 deletions

View file

@ -4,8 +4,8 @@ if not env_conf then
if not env_conf then if not env_conf then
error("Couldn't determine potential config directory is $HOME set?") error("Couldn't determine potential config directory is $HOME set?")
end end
env_conf = env_conf.."/.config/" env_conf = mez.fs.joinpath(env_conf, ".config")
end end
mez.path.config = env_conf.."/mez/init.lua" mez.path.config = mez.fs.joinpath(env_conf, "mez", "init.lua")
package.path = package.path..";"..env_conf.."/mez/lua/?.lua" package.path = package.path..";"..mez.fs.joinpath(env_conf, "mez", "lua", "?.lua")

View file

@ -0,0 +1,43 @@
const Fs = @This();
const std = @import("std");
const zlua = @import("zlua");
const Lua = @import("lua.zig");
const gpa = std.heap.c_allocator;
pub fn joinpath(L: *zlua.Lua) i32 {
const nargs: i32 = L.getTop();
if (nargs < 2) {
L.raiseErrorStr("Expected at least two paths to join", .{});
return 0;
}
var paths = std.ArrayList([:0]const u8).initCapacity(gpa, @intCast(nargs)) catch {
return 0;
};
defer paths.deinit(gpa);
var i: u8 = 1;
while (i <= nargs) : (i += 1) {
if (!L.isString(i)) {
L.raiseErrorStr("Expected string at argument %d", .{i});
return 0;
}
const partial_path = L.toString(i) catch unreachable;
paths.append(gpa, partial_path) catch {
// TODO: tell lua?
return 0;
};
}
const final_path: []const u8 = std.fs.path.join(gpa, paths.items) catch {
// TODO: tell lua?
return 0;
};
_ = L.pushString(final_path);
return 1;
}

View file

@ -5,6 +5,7 @@ const config = @import("config");
const zlua = @import("zlua"); const zlua = @import("zlua");
const Bridge = @import("bridge.zig"); const Bridge = @import("bridge.zig");
const Fs = @import("fs.zig");
const gpa = std.heap.c_allocator; const gpa = std.heap.c_allocator;
@ -51,6 +52,11 @@ pub fn init(self: *Lua) !void {
self.state.newTable(); self.state.newTable();
defer _ = self.state.setField(-2, "path"); defer _ = self.state.setField(-2, "path");
} }
{
const funcs = zlua.fnRegsFromType(Fs);
self.state.newLib(funcs);
self.state.setField(-2, "fs");
}
} }
loadRuntimeDir(self) catch |err| { loadRuntimeDir(self) catch |err| {