34 lines
1.4 KiB
Zig
34 lines
1.4 KiB
Zig
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;
|
|
}
|