fix up paths

This commit is contained in:
Emil Lerch 2025-10-09 09:46:32 -07:00
parent d66fdd5cae
commit 78be667a16
Signed by: lobo
GPG key ID: A7B62D657EF764F8
3 changed files with 63 additions and 44 deletions

View file

@ -199,8 +199,8 @@ pub fn build(b: *std.Build) !void {
// Copy data files to install directory // Copy data files to install directory
const install_data = b.addInstallDirectory(.{ const install_data = b.addInstallDirectory(.{
.source_dir = upstream.path("data"), .source_dir = upstream.path("data"),
.install_dir = .bin, .install_dir = .{ .custom = "share" },
.install_subdir = "data", .install_subdir = "link",
}); });
install_data.step.dependOn(&download_link_step.step); install_data.step.dependOn(&download_link_step.step);

View file

@ -84,49 +84,68 @@ fn sendWemoCommand(allocator: std.mem.Allocator, device_entry: std.hash_map.Stri
} }
fn loadDeviceConfig(allocator: std.mem.Allocator, bin_dir: []const u8) !std.StringHashMap([]const u8) { fn loadDeviceConfig(allocator: std.mem.Allocator, bin_dir: []const u8) !std.StringHashMap([]const u8) {
// Try current directory first
if (loadConfigFromPath(allocator, "controlData.json")) |config| {
return config;
} else |_| {}
// Try controlData.json in bin directory
const json_path = try std.fs.path.join(allocator, &[_][]const u8{ bin_dir, "controlData.json" });
defer allocator.free(json_path);
if (loadConfigFromPath(allocator, json_path)) |config| {
return config;
} else |_| {}
// Try ../share/pos relative to bin directory
const share_path = try std.fs.path.join(allocator, &[_][]const u8{ bin_dir, "../share/pos/controlData.json" });
defer allocator.free(share_path);
if (loadConfigFromPath(allocator, share_path)) |config| {
return config;
} else |_| {}
return loadDevicesFromTxt(allocator, bin_dir);
}
fn loadConfigFromPath(allocator: std.mem.Allocator, path: []const u8) !std.StringHashMap([]const u8) {
var devices = std.StringHashMap([]const u8).init(allocator); var devices = std.StringHashMap([]const u8).init(allocator);
const file = if (std.fs.path.isAbsolute(path))
std.fs.openFileAbsolute(path, .{}) catch return error.FileNotFound
else
std.fs.cwd().openFile(path, .{}) catch return error.FileNotFound;
defer file.close();
const content = try file.readToEndAlloc(allocator, 1024 * 1024);
defer allocator.free(content);
var stderr_writer = std.fs.File.stderr().writer(&.{}); var stderr_writer = std.fs.File.stderr().writer(&.{});
const stderr = &stderr_writer.interface; const stderr = &stderr_writer.interface;
// Try controlData.json first const parsed = std.json.parseFromSlice(std.json.Value, allocator, content, .{}) catch |err| {
const json_path = try std.fs.path.join(allocator, &[_][]const u8{ bin_dir, "controlData.json" }); try stderr.print(
defer allocator.free(json_path); "Failed to parse controlData.json: {}. Ignoring controlData.json, looking for devices.txt",
.{err},
);
return error.ParseError;
};
defer parsed.deinit();
if (std.fs.openFileAbsolute(json_path, .{})) |file| { const root = parsed.value.object;
defer file.close(); const device_array = root.get("devices").?.array;
const content = try file.readToEndAlloc(allocator, 1024 * 1024); for (device_array.items) |device| {
defer allocator.free(content); const device_obj = device.object;
const name = device_obj.get("name").?.string;
const url = device_obj.get("url").?.string;
const parsed = std.json.parseFromSlice(std.json.Value, allocator, content, .{}) catch |err| { if (name.len > 0) {
try stderr.print( const name_copy = try allocator.alloc(u8, name.len);
"Failed to parse controlData.json: {}. Ignoring controlData.json, looking for devices.txt", _ = std.ascii.lowerString(name_copy, name);
.{err}, try devices.put(name_copy, try allocator.dupe(u8, url));
); std.log.debug("Loaded device: '{s}' -> {s}", .{ name, url });
return loadDevicesFromTxt(allocator, bin_dir);
};
defer parsed.deinit();
const root = parsed.value.object;
const device_array = root.get("devices").?.array;
for (device_array.items) |device| {
const device_obj = device.object;
const name = device_obj.get("name").?.string;
const url = device_obj.get("url").?.string;
if (name.len > 0) {
const name_copy = try allocator.alloc(u8, name.len);
_ = std.ascii.lowerString(name_copy, name);
try devices.put(name_copy, try allocator.dupe(u8, url));
std.log.debug("Loaded device: '{s}' -> {s}", .{ name, url });
}
} }
return devices;
} else |_| {
return loadDevicesFromTxt(allocator, bin_dir);
} }
return devices;
} }
fn loadDevicesFromTxt(allocator: std.mem.Allocator, bin_dir: []const u8) !std.StringHashMap([]const u8) { fn loadDevicesFromTxt(allocator: std.mem.Allocator, bin_dir: []const u8) !std.StringHashMap([]const u8) {

View file

@ -291,10 +291,10 @@ pub const Parser = struct {
pub fn init(allocator: std.mem.Allocator) !Parser { pub fn init(allocator: std.mem.Allocator) !Parser {
const dict = c.dictionary_create( const dict = c.dictionary_create(
@ptrCast(@constCast("data/4.0.dict")), @ptrCast(@constCast("../share/link/4.0.dict")),
@ptrCast(@constCast("data/4.0.knowledge")), @ptrCast(@constCast("../share/link/4.0.knowledge")),
@ptrCast(@constCast("data/4.0.constituent-knowledge")), @ptrCast(@constCast("../share/link/4.0.constituent-knowledge")),
@ptrCast(@constCast("data/4.0.affix")), @ptrCast(@constCast("../share/link/4.0.affix")),
); );
if (dict == null) return error.DictionaryCreationFailed; if (dict == null) return error.DictionaryCreationFailed;
@ -319,13 +319,13 @@ pub const Parser = struct {
} }
pub fn initWithDataDir(allocator: std.mem.Allocator, data_dir: []const u8) !Parser { pub fn initWithDataDir(allocator: std.mem.Allocator, data_dir: []const u8) !Parser {
const dict_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "data/4.0.dict" }); const dict_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "../share/link/4.0.dict" });
defer allocator.free(dict_path); defer allocator.free(dict_path);
const knowledge_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "data/4.0.knowledge" }); const knowledge_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "../share/link/4.0.knowledge" });
defer allocator.free(knowledge_path); defer allocator.free(knowledge_path);
const constituent_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "data/4.0.constituent-knowledge" }); const constituent_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "../share/link/4.0.constituent-knowledge" });
defer allocator.free(constituent_path); defer allocator.free(constituent_path);
const affix_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "data/4.0.affix" }); const affix_path = try std.fs.path.join(allocator, &[_][]const u8{ data_dir, "../share/link/4.0.affix" });
defer allocator.free(affix_path); defer allocator.free(affix_path);
const dict_cstr = try allocator.dupeZ(u8, dict_path); const dict_cstr = try allocator.dupeZ(u8, dict_path);