aboutsummaryrefslogtreecommitdiff
path: root/src/storage/image-manager/root.zig
blob: 7742df231b74660f637c357a5102cf77333d7818 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const std = @import("std");

const Storage = @import("../root.zig");
pub const Image = @import("image.zig");

const Self = @This();

pub const empty: Self = .{};

items: std.ArrayList(Image) = .empty,
rw_lock: std.Thread.RwLock = .{},

pub const LockedImages = struct {
    images: []Image,
    rw_lock: *std.Thread.RwLock,

    pub fn deinit(self: *const @This()) void {
        self.rw_lock.unlockShared();
    }
};

pub fn init(
    self: *Self,
    storage: *Storage,
) !void {
    var dir = storage.dir.openDir("image", .{ .iterate = true }) catch blk: {
        try storage.dir.makeDir("image");
        break :blk try storage.dir.openDir("image", .{ .iterate = true });
    };
    defer dir.close();

    var iterator = dir.iterate();

    errdefer self.items.deinit(storage.allocator);

    while (try iterator.next()) |entry| {
        if (entry.kind == .file and std.mem.endsWith(u8, entry.name, ".jpg")) {
            try self.items.append(
                storage.allocator,
                try .init(storage.allocator, entry.name[0..entry.name.len - 4])
            );
        }
    }
}

pub fn add(
    self: *Self,
    storage: *Storage,
    reader: *std.Io.Reader,
    size: usize,
) !void {
    self.rw_lock.lock();
    defer self.rw_lock.unlock();

    try self.items.append(
        storage.allocator,
        try Image.new(storage, reader, size),
    );
}

pub fn list(self: *Self) LockedImages {
    return .{
        .images = self.items.items,
        .rw_lock = &self.rw_lock,
    };
}