const std = @import("std"); const Document = @import("../models/Document.zig"); /// Сохраняет значение произвольного типа T в JSON-файл. pub fn saveToFile(comptime T: type, value: *const T, path: []const u8) !void { var file = try std.fs.cwd().createFile(path, .{ .truncate = true }); defer file.close(); var buffer: [4096]u8 = undefined; var writer = file.writer(&buffer); try std.json.Stringify.value(value, .{ .whitespace = .indent_2 }, &writer.interface); try writer.interface.flush(); } /// Загружает значение типа T из JSON-файла. /// Для Document после разбора делается клон через allocator, т.к. парсер выделяет память /// из арены — при закрытии документа её нельзя освобождать нашим аллокатором. pub fn loadFromFile(comptime T: type, allocator: std.mem.Allocator, path: []const u8) !T { var file = try std.fs.cwd().openFile(path, .{}); defer file.close(); const data = try file.readToEndAlloc(allocator, std.math.maxInt(usize)); defer allocator.free(data); var parsed = try std.json.parseFromSlice(T, allocator, data, .{ .ignore_unknown_fields = true }); if (T == Document) { defer parsed.deinit(); return try parsed.value.clone(allocator); } return parsed.value; }