69 lines
1.9 KiB
Zig
69 lines
1.9 KiB
Zig
const std = @import("std");
|
|
const Db = @import("Db.zig");
|
|
|
|
const Item = @import("Item.zig");
|
|
const Tag = @import("Tag.zig");
|
|
const json = @import("json.zig");
|
|
const request = @import("request.zig");
|
|
const util = @import("util.zig");
|
|
|
|
pub fn main() !void {
|
|
var db = Db.open("test.tkh", true, "");
|
|
const sock_path = "/tmp/mgtzm.sock";
|
|
|
|
// Remove the socket file if it exists
|
|
std.fs.deleteFileAbsolute(sock_path) catch |err| {
|
|
switch (err) {
|
|
// Do not error out if the file doesn't exist
|
|
error.FileNotFound => {},
|
|
else => unreachable,
|
|
}
|
|
};
|
|
|
|
var server = std.net.StreamServer.init(.{});
|
|
defer server.deinit();
|
|
const addr = try std.net.Address.initUnix(sock_path);
|
|
|
|
try server.listen(addr);
|
|
|
|
while (true) {
|
|
|
|
// Initialization
|
|
// ----------------
|
|
|
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
defer arena.deinit();
|
|
const allocator = arena.allocator();
|
|
|
|
const connection = try server.accept();
|
|
defer connection.stream.close();
|
|
|
|
// Receive and process message
|
|
// ----------------
|
|
|
|
const read = connection.stream.reader();
|
|
|
|
var msg = util.readUntilDelimiterAllocZ(read, allocator, 0, 1024) catch |err| {
|
|
std.debug.print("Failed to read from connection: {any}\n", .{err});
|
|
continue;
|
|
};
|
|
defer allocator.free(msg);
|
|
|
|
var jobj = json.Obj.newFromString(msg) catch {
|
|
var errorObj = json.Obj.newObject();
|
|
errorObj.objectAddString("error", "Invalid JSON request.");
|
|
|
|
_ = connection.stream.write(errorObj.toString()) catch {};
|
|
continue;
|
|
};
|
|
defer jobj.deinit();
|
|
|
|
const answer = try request.process(&jobj, &db, allocator);
|
|
defer allocator.free(answer);
|
|
|
|
// Reply
|
|
// ----------------
|
|
_ = try connection.stream.write(answer);
|
|
}
|
|
}
|